如何解决在 C++ 上的函数 gets() 后清除字符数组
我正在努力学习 C++。有时我对 C 风格的字符串及其函数感到困惑。我一直在用
char var[1];
fflush(stdin);
gets(var);
将字符串写入字符数组。我不知道那是不是最有效的方法,但我就是这样被教导的。
现在,我正在制作一个控制台程序,在其中我以这种方式读取一些变量并使用它们进行处理。一切正常,但我有一个字符数组 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
。
我有一个字符数组,estudios[1]
strcmp(estudios,"N") != 0
长度为1的字符数组只能包含长度为0的空终止字符串。字符串“N”包含两个字符:'N'和'\0',即空终止字符。
如果 estudios[0] 不是空终止字符,则它不包含空终止字符串,将其传递给 strcmp
将违反函数的先决条件和程序将是未定义的。
为什么会这样?
程序的行为未定义。
它应该这样做吗?
您不应该将非空终止字符串传递到 strcmp
。
这是一个固定的程序,它可能会做你想做的事情(你的例子不完整,所以我猜):
std::string indicator;
char c;
std::cin >> c;
if (c != 'N') {
cout << "Estudios completos o incompletos?" << endl;
std::cin >> indicador;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。