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

Posted

技术标签:

【中文标题】在 C++ 上的函数 gets() 后,字符数组被清除【英文标题】:Char array gets cleared after function gets() on C++ 【发布时间】:2021-06-25 23:14:45 【问题描述】:

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

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

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

现在,我正在制作一个控制台程序,在该程序中我以这种方式读取一些变量并使用它们进行操作。一切正常,但我有一个 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)之后发生变化; 为什么会这样?它应该这样做吗?抱歉问了这么一个新手问题

【问题讨论】:

char var[1]; 最多可以存储 0 个字符的字符串。不要使用gets(),它具有不可避免的缓冲区溢出风险,在 C99 中已弃用并从 C11 中删除。使用 C++ 时,您应该使用 std::getline()std::string 另外,永远不要使用fflush(stdin);。它可能似乎适用于某些系统,但它是未定义的行为。 fflush 函数专为输出流而设计。 “这就是我被教导的方式。”谁教的?解雇坏老师! The man page for gets 字面意思是“从不使用gets()”。如果告诉你如何使用某物的文档说永远不要使用它,并且说在过去的几十年里,你真的不得不怀疑教授是什么时候被教的,以及他们跟上的认真程度。 哈哈现在我不知道该怎么做,这就是我的教授要我们使用的:/我猜他根本不在乎,因为他还告诉我们使用 getch() 我读过它也不应该使用。 【参考方案1】:

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


我有一个 char 数组,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;

【讨论】:

现在我明白我的问题是什么了。多谢!!我刚刚将 estudios[1] 的定义更改为 estudios[2] 我还在用gets(),恐怕我的教授不接受其他方式 按照教授的要求完成课程,但如果您打算从事编程职业,我强烈建议您通过一些最新的编程参考资料来补充您的教育。你进入劳动力市场会更加顺利,而且你不必追赶。您总是需要赶上一点,因为随着我们找到更有效的方法,习语、最佳实践甚至语言都会发生变化。 好的,谢谢,我将开始学习实际的方法,这样我就不会落后。对于初学者,我应该避免这样的其他具体事情吗?

以上是关于在 C++ 上的函数 gets() 后,字符数组被清除的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何用gets();语句来接收一个二维数组

ACM中gets函数用不了

ACM中gets函数用不了

C++入门经典-例6.15-通过字符串函数连接两个字符数组

C语言中如何用 gets(),put()

如何调用gets输入一个二维数组 麻烦各位编程高手提供帮助