我尝试验证用户是否没有输入任何内容,这样
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仍然等待有效输入。问题是如何正确地验证是否没有引入?
答案 0 :(得分:2)
C ++ ==
运算符将实际比较指针。您想使用字符串,而不是char *(或使用C风格的strcmp)。
例如:
char*a = "abc"
char*b = "abc"
a == b
返回false。
答案 1 :(得分:2)
声明:
std::cin >> name
在开始真实阅读之前,将跳过每个空白字符。以下字符被视为空白(空格,制表符,CR)。
因此,在开始阅读“name”之前,它会等到输入blak的不同之处。
请注意,如果键入的字符串比缓冲区大小(255)更长,则此代码不安全。
答案 2 :(得分:1)
除了代码的非C ++之外,确切的问题是name
是指向字符的指针,""
是字符数组。代码name == ""
返回false,因为name不指向数组中的第一个char。相反,您需要通过检查NULL终止符是否是第一个字符来检查已分配的数组是否为空。 if (name[0] == '\0')
现在对于C ++而言:不要使用char*
,请使用std::string
。此外,如果您收到无效数据,您的代码将继续提示。
答案 3 :(得分:1)
据我所知,你不允许使用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 *
玩得开心! ))
答案 4 :(得分:0)
您还应该记住,必须释放由“new”创建的任何内容。您的算法中存在严重的内存泄漏。在这种情况下,堆分配不是一个好方法。
最简单的解决方案是使用std :: string。它更安全(没有内存泄漏,你可以把字符串长于255个标志)。在[i ++]中还有I ++确保“i”不会高于数组大小(我猜它是一个数组)。有一个std :: vector可以帮助你。