在 C++ 上的函数 gets() 之后,Char 数组被清除

Char array gets cleared after function gets() on C++

我正在努力学习 C++。有时我对 C 风格的字符串及其函数感到困惑。我一直在用

char var[1];
fflush(stdin);
gets(var);

将字符串写入字符数组。我不知道这是否是最有效的方法,但我就是这样被教导的。

现在,我正在制作一个控制台程序,在其中我以这种方式读取一些变量并使用它们进行处理。一切正常,但我有一个 char 数组,estudios[1],我必须将它与 strcmp 进行比较(我不是在谈论 strcmp(estudios, "N") != 0 我在下面写的)到特定值而且我发现无论 estudios 的价值如何,比较的结果总是一样的。我意识到在这段代码之后:

if (strcmp(estudios, "N") != 0){
    cout << "Estudios completos o incompletos?" << endl;
    fflush(stdin);
    gets(indicador);
}

假设estudios的值为“P”。在我显示 estudios 的值是“P”的代码之前,但在它之后它将它的值更改为“”。更准确地说,它在 gets(indicator) 之后发生变化; 为什么会这样?它应该这样做吗?很抱歉这样的新手问题

不要使用 gets。有危险。根本不应该使用它。它已从 C 和 C++ 标准中删除。不要使用 gets.


I have a char array, estudios[1]

strcmp(estudios, "N") != 0

长度为1的字符数组只能包含长度为0的空终止字符串。字符串“N”包含两个字符:'N'和'\0',它是空终止字符。

如果 estudios[0] 不是空终止字符,则它不包含空终止字符串,将它传递给 strcmp 将违反函数的前置条件和程序的行为将是不确定的。

Why does that happen?

程序的行为未定义。

Is it supposed to do that?

您不应该将非空终止字符串传递给 strcmp


这是一个固定的程序,它可能会做你想做的事情(你的例子不完整,所以我猜):

std::string indicator;
char c;
std::cin >> c;
if (c != 'N') {
    cout << "Estudios completos o incompletos?" << endl;
    std::cin >> indicador;
}