簡體   English   中英

輸入cin C ++沒什么

[英]Nothing at input cin C++

我嘗試驗證用戶是否未輸入任何內容,這種方式

bool null_input = false;
int i = 0;

while (null_input == false) {

char *name = new char[255];
std::cout<<"Name :";
std::cin>>name;

if (name == "") {

null_input = true;
break;

 }

else star[i++].name = name;

}

無論如何,如果我在不輸入任何內容的情況下按ENTER鍵,cin仍然會等待有效輸入。 問題是如何正確驗證是否未引入任何內容?

C ++ ==運算符將實際比較指針。 您想使用字符串,而不是char *(或使用C風格的strcmp)。

例如:

char*a = "abc"
char*b = "abc"
a == b

返回false。

該聲明:

std::cin >> name

在開始實際閱讀之前,將跳過每個空白字符。 以下字符被視為空白(空格,制表符,CR)。

因此,它將等到鍵入不同於blak的內容后再開始讀取“ name”。

請注意,如果鍵入的字符串長於緩沖區大小(255),則此代碼不安全。

除了代碼的非C ++語言之外,確切的問題是name是指向chars的指針,而""是chars的數組。 代碼name == ""返回false,因為名稱未指向數組中的第一個字符。 相反,您將要通過檢查NULL終止符是否為第一個字符來檢查已分配的數組是否為空。 if (name[0] == '\\0')

現在,對於C ++而言:不要使用char* ,請使用std::string 此外,如果有無效數據,您的代碼也會不斷向后提示。

據我了解,您不允許使用c ++ string ,所以希望此c樣式的代碼對您有用

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    const int name_size = 255;
    char *name = new char[name_size];
    while (true) {
        cout << "Name :";
        cin.getline(name, name_size);
        if (strlen(name) != 0) break;
        cout << "not a valid name...";
    }

    cout << "got the name " << name << " -- it is OK!\n";
    delete [] name;
    return 0;
}

希望對您有幫助,與char *玩樂! ))

您還應該記住,必須釋放由“ new”創建的所有內容。 您的算法中存在嚴重的內存泄漏。 在這種情況下,堆分配不是一個好方法。

最簡單的解決方案是使用std :: string。 這樣更安全(不存在內存泄漏,並且您可以輸入長度超過255個符號的字符串)。 [i ++]中也有I ++,請確保“ i”不會大於數組大小(我想它是數組)。 有一個std :: vector可以幫助您。

暫無
暫無

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

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