【问题标题】:I can´t print a string that was read using the "gets" function [duplicate]我无法打印使用“gets”函数读取的字符串 [重复]
【发布时间】:2016-06-21 02:20:43
【问题描述】:

如果我先读取字符串值然后读取 int 值,它会起作用。 我尝试使用函数gets 而不是scanf,因为gets 让我可以在同一行中读取多个单词。

我也试过fgets,但也有同样的问题。

我使用的是 cygwin 32 位编译器版本 2.874。我使用代码块 ide 13.12。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i;
    char s[10];

    printf("Value int:\n");
    scanf("%d",&i);
    printf("%d\n",i);

    printf("Value string:");
    fflush(stdin);
    gets(s);
    printf("%s\n",s);

    getchar();
    return 0;
}

【问题讨论】:

  • 你不应该使用 gets 。改用 fgets ==> fgets(s, 10, stdin);或 scanf ==> scanf("%9s", s);
  • gets 不是标准的(不再),每个工具链都应该以一种或另一种方式对你大喊大叫。 永远不要使用它!而fflush(stdin) 调用未定义的行为。也不要使用它!
  • scanf 如果使用正确,也可以在一行中读取多个单词。而且你用的是哪个IDE无关紧要,编译器可能会担心,cygwin不是编译器。
  • 请参阅Why the gets() function is to dangerous to be used,了解为什么不应该使用它以及有哪些替代方案。您还需要检查返回结果。您应该查看Using fflush(stdin),讨论为什么要谨慎使用。

标签: c


【解决方案1】:

在调用scanf 之后,输入缓冲区中会留下一个换行符。因此,当您调用 gets 时,只会接收到换行符。

根据 C 标准,调用 fflush(stdin) 是未定义的行为,尽管 MSVC 支持它作为扩展。您应该改用 getchar 从缓冲区中读取换行符。

【讨论】:

  • 在调用 'scanf' 之后和调用 'gets' 之前使用 'getchar' 非常有用。谢谢!。
  • 我听从了你的建议,所以我使用了 fgets。 printf("值 int:\n"); scanf("%d",&i); printf("%d\n",i);获取字符(); // 这行非常有用。 printf("值字符串:"); fgets (s , sizeof s , 标准输入); printf("%s\n",s);再次感谢。
【解决方案2】:

当你输入整数时,第二个输入会换行,试试scanf

scanf(" %s", s); // here the space will emit the previous newline or space

或者更好地使用fgets,它将输入限制为缓冲区的大小:

fgets(s, sizeof s, stdin);

另外,不要使用gets,它很危险并且会导致缓冲区溢出。并且不要在stdin 上调用fflushstdin 是输入流,刷新它是未定义的行为。

【讨论】:

  • gets 没有被弃用,但它甚至不是 C 标准库的一部分。
  • @Olaf 它是 C89 和 C99 的一部分,在 C11 中被删除。
  • 重点是,C90 和 C99 不是标准的,因此它们没有定义 C 标准 库的一部分。
  • Olaf 的观点是,C99 标准正式取消并替换了 C90 标准,C11 标准正式取消并替换了 C99 标准。就 ISO 而言,C11(正式名称为 ISO/IEC 9899:2011 (E))是唯一的 C 标准。更现实地说,恕我直言,将旧标准称为标准是完全合理的,只要您知道它们已被取代。许多编译器仍然支持旧版本的标准。
  • 好吧,我明白了,也许将 C11 称为 current C 标准,而将 C99 和其他标准称为以前的标准可能会更好。 :)
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2021-11-02
  • 2023-03-27
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多