微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++ 上的函数 gets() 后清除字符数组

如何解决在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?