2017-04-09 16 views
5

Tôi đã thử chuyển các đầu vào khác nhau bằng mã bên dưới, nhưng không nhận được thông báo được in: "Rất tiếc, bạn đã không nhập một thẻ ASCII, hãy để một mình là y hoặc n!" Tôi đã nhập các ký tự Unicode khác nhau mà không phải là loại char (về cơ bản chỉ đục trong ALT + số ngẫu nhiên, ví dụ như, š, ², Ž, ±. Không ai trong số này tạo ra lỗi. các ký tự ASCIICó thể std :: cin không chuyển được đầu vào của người dùng vào dòng lệnh tới biến có kiểu char không?

std::cout << "Would you like to play again? Enter y or n: "; 
std::cin >> yOrN; 
isChar = std::cin.fail(); 
//check if the user did not enter an ASCII char, e.g. test with a Unicode character 
if (isChar) 
{ 
    std::cout << "Oops, you did not enter an ASCII char, let alone one that is y or n!\n"; 
    std::cin.clear(); 
} 

OS: Windows 10 64 bit, x64 dựa trên bộ xử lý Compiler: Visual Studio Cộng đồng 2015

tôi đã không thể giải quyết vấn đề này thông qua tìm kiếm "trích xuất một nhân vật phi ASCII cin C++ "và xem ba trang đầu tiên.

Tôi rất mới trên Stack Overflow, vì vậy hãy tha thứ cho tôi nếu tôi đã vi phạm bất kỳ quy tắc hoặc quy tắc ứng xử nào với câu hỏi này. Tôi đang học C++ trên learncpp.com và đang viết mã của riêng mình để trả lời câu hỏi số 2 của số page này.

Cập nhật: Tôi đoán không có lý do gì để chương trình của tôi xác thực xem liệu có nhập một thẻ không. Tuy nhiên, tôi đoán có lẽ tôi rất tò mò muốn biết rằng tôi không nghĩ quá nhiều về việc liệu nó có thực sự cần thiết cho chương trình hay không.

Trả lời

1

std::cin.fail(); sẽ trả về true nếu luồng cơ bản không đọc hoặc ghi dữ liệu. nó không liên quan gì đến mã hóa bạn cung cấp.

Điều đáng nói đến là char không thực sự nhận biết về utf-8 hoặc ASCII, nó chỉ là một byte. các luồng C++ cũng không xác thực mã hóa dữ liệu.

Vì vậy, trong trường hợp này, Ž (và các loại khác) là đầu vào hợp lệ cho std::cin.

Nếu bạn muốn xác chỉ ASCII, bạn cần phải làm điều đó cho mình:

std::cin >> c; 
if (c < 0 || c > 127) { /*handle non ASCII chars*/ } 

Trong trường hợp của bạn, bạn cần phải xác nhận đối với y hoặc n:

std::cin >> c; 
if (c != 'y' && c != 'n') { /*handle invalid input*/ } 
+0

plain 'char' sẽ không bao giờ vượt quá 127 trên các hệ thống phổ biến –

+0

@MM nếu 'char' thực sự chưa được ký? –

+0

nếu nó không phải là gì? OP cho biết MSVC++ 2015. –

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