输入cin C ++没什么

时间:2012-02-21 18:48:43

标签: c++ cin

我尝试验证用户是否没有输入任何内容,这样

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仍然等待有效输入。问题是如何正确地验证是否没有引入?

5 个答案:

答案 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可以帮助你。