簡體   English   中英

C++:為什么 cin 允許整數輸入字符串?

[英]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 int1786080624

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM