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