2012-12-22 62 views
5

Tôi mới bắt đầu với C# Tôi đã bắt đầu học nó để mở rộng các ngôn ngữ lập trình để xử lý nhưng tôi đã gặp phải một vấn đề nhỏ mà tôi không gặp phải trong cả C và Java.Hãy thử so sánh các ký tự trong C#

Tôi đang cố gắng nhận phản hồi của người dùng từ bàn phím và sau đó so sánh với trường hợp có thể xảy ra và nếu không có trường hợp nào khớp với nhau thì tôi muốn người dùng phải lặp lại quy trình cho đến khi anh ấy nhập đúng giá trị.

String input = Console.ReadLine(); 
     while ((input[0] != 'N') || (input[0] != 'Y')) 
     { 
      input = Console.ReadLine(); 

     } 
     if (input[0] == 'N') 
     { 
      Console.WriteLine("NO"); 
      Console.ReadKey(); 
     } 
     else if (input[0] == 'Y') 
     { 
      Console.WriteLine("YES"); 
      Console.ReadKey(); 
     } 

Đây không phải là cách hiệu quả nhất mà tôi đã thử, tôi cũng đã thử làm một vòng lặp while và nhiều biến thể khác.

Vấn đề tôi gặp phải là khi vòng lặp while không được kích hoạt, mọi thứ hoạt động tốt, nhưng khi tôi thêm nó vào, nó luôn đi vào vòng lặp ngay cả khi đầu vào là N hoặc Y và không bao giờ rời khỏi vòng lặp mặc dù rõ ràng là nó sai.

Xin vui lòng nếu ai đó có thể cho tôi một số hiểu biết về lý do tại sao điều này xảy ra hoặc nếu ai đó có thể đề xuất một cách tốt hơn để làm điều này, nó sẽ được đánh giá cao. Cảm ơn bạn.

Karim

+2

Thay thế || với && –

+0

thử chuyển đổi và ngắt .. – sajanyamaha

+0

Tôi nghĩ bạn nên làm một cái gì đó như: Trong khi (! (đầu vào [0] == 'Y' || đầu vào [0] == 'N')) –

Trả lời

6

Ngay bây giờ, điều kiện trong tuyên bố trong khi bạn sẽ luôn đúng. Cách tốt nhất để kiểm tra điều này là đặt điểm ngắt nơi vòng lặp while đang được kiểm tra và sau đó "Thêm đồng hồ" vào từng phần của điều kiện.

Thay đổi

while ((input[0] != 'N') || (input[0] != 'Y')) 

để

while ((input[0] != 'N') && (input[0] != 'Y')) 
+0

Cảm ơn bạn rất nhiều , tôi cảm thấy như một kẻ ngốc ngốc nghếch. – JahKnows

0

Vâng tình trạng của bạn là vấn đề. Hai điều kiện của bạn là Ored, nghĩa là nếu một trong các điều kiện là đúng, thì vòng lặp sẽ thực thi. Vì vậy, bạn đầu tiên Hoặc các điều kiện và Không phải là kết quả như thế! (Condition1 || condition2) như bên dưới

 String input = Console.ReadLine(); 

     while (!((input[0] != 'N') || (input[0] != 'Y'))) 
     { 
      input = Console.ReadLine(); 
     } 

     if (input[0] == 'N') 
     { 
      Console.WriteLine("NO"); 
      Console.ReadKey(); 
     } 

     else if (input[0] == 'Y') 
     { 
      Console.WriteLine("YES"); 
      Console.ReadKey(); 
     } 
1

Sự cố này đang trong quá trình kiểm tra điều kiện.

while ((input[0] != 'N') || (input[0] != 'Y')) 

Giả sử 'N' được nhập. Bây giờ, điều kiện (input[0] != 'Y') trở thành false và nó sẽ thoát ra khỏi vòng lặp while nhưng vì || với (input[0] != 'N') vẫn còn đúng, kết quả cuối cùng trong điều kiện xuất hiện là đúng và do đó nó không bao giờ thoát ra khỏi vòng lặp.

Thay thế || với & &

1

Hãy thử điều này: -

String input = Console.ReadLine(); 
     while ((input[0] != 'N') && (input[0] != 'Y')) 
     { 
      input = Console.ReadLine(); 

     } 
     if (input[0] == 'N') 
     { 
      Console.WriteLine("NO"); 
      Console.ReadKey(); 
     } 
     else if (input[0] == 'Y') 
     { 
      Console.WriteLine("YES"); 
      Console.ReadKey(); 
     } 
3

Như tất cả mọi người đã chỉ ra, bạn đang sử dụng || nơi bạn nên sử dụng &&.

Ngoài ra, bạn cũng đang cố truy cập ký tự đầu tiên của chuỗi có thể trống. Điều này sẽ gây ra một ngoại lệ nếu người dùng chỉ cần nhấn 'Enter'.

Vì bạn đã yêu cầu một cách tốt hơn, đây là một cách thay thế, sử dụng Console.ReadKey thay vì Console.ReadLine, vì bạn dường như chỉ quan tâm đến việc nhận một ký tự. Nó cũng có lợi thế là nó không phân biệt chữ hoa chữ thường.

while (true) 
{ 
    ConsoleKeyInfo key = Console.ReadKey(); 
    Console.WriteLine(""); // Just for nice typesetting. 

    if (key.Key == ConsoleKey.N) 
    { 
     Console.WriteLine("NO"); 
     break; 
    } 

    if (key.Key == ConsoleKey.Y) 
    { 
     Console.WriteLine("YES"); 
     break; 
    } 
} 
+0

+1 ConcoleKey là cách tiếp cận tốt hơn – exexzian

Các vấn đề liên quan