[英]C++: Why does cin allow ints for inputs of strings?
我正在開展一個學校項目,該項目需要驗證輸入的字符串,而不是其他任何東西。 但是,每當我通過一個 int 進行錯誤測試 (IE 0) 時,程序都不會觸發 cin.fail()。 例如:
#include <iostream>
#include <string>
using namespace std;
int main() {
string lastName;
cin >> lastName;
if (cin.fail()) {
cout << "INT";
}
else {
cout << "STRING";
}
return 0;
}
輸入:1999
OUTPUT:字符串
為什么會這樣? 我使用完全相同的結構創建了一個個人項目,在那里沒有問題,但無法讓它在這里正常工作。
那是因為程序認為你輸入的數據是一個字符串。 為什么不改變呢? int a
,然后cin>>a
。 如果cin.fail()
為真,則它是一個字符串。 如果為假,則為 integer。
#include <iostream>
#include <string>
using namespace std;
int main() {
int lastName;
cin >> lastName;
if (cin.fail()) {
cout << "STRING";
}
else {
cout << "INT";
}
return 0;
}
字符串是一個字符序列。 因此, 1999
是一個有效的字符串。
如果要驗證字符串是否僅包含字母字符且不包含任何數字,則可以對字符串中的每個字符使用 function std::isalpha
:
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string lastName;
std::cin >> lastName;
if ( std::cin.fail())
{
std::cout << "Input failure!\n";
return 0;
}
for ( char c : lastName )
{
if ( !std::isalpha( static_cast<unsigned char>(c) ) )
{
std::cout << "String is invalid!\n";
return 0;
}
}
std::cout << "String is valid!\n";
return 0;
}
但是請注意,在默認locale中, std::isalpha
只會將標准字母'A'
到'Z'
和'a'
到'z'
視為有效字母,而不考慮ê
和ä
等字母。 因此,如果您正在處理非英文字符,您可能必須更改語言環境。
int 0
只是0x00 0x00 0x00 0x00
,它是一串字節。 所有類型都是字節串。 重要的是如何解釋這些字節。 因此,如果cin
需要一個字節字符串並且您將其交給0x00 0x00 0x00 0x00
,它會將其視為文本。
相反, "jump"
是0x6a 0x75 0x6d 0x70
解釋為 4 字節 integer int
是1786080624
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.