【问题标题】:Gets() not working获取()不工作
【发布时间】:2013-11-10 13:03:04
【问题描述】:

我试图使用gets() 从用户那里获取一个字符串,但程序似乎正在通过gets()。用户没有暂停输入。为什么gets() 什么都不做?

char name[13];
printf("Profile name: ");
gets(name);
printf("\n%s", name);

【问题讨论】:

  • @DerekDrummond 输入 12 个字符,最后一个必须是 '\0'
  • 请使用fgets(name, sizeof name, stdin) 而不是gets() 问题被多次回答 看到一个答案stackoverflow.com/questions/7231349/…
  • 也不要使用scanf 来读取字符串。只需使用fgets
  • 我相信您可以在 scanf 格式的末尾留下一个空格,以使其消耗输入中的任何空格(例如尾随换行符)。但不要引用我的话。
  • 我试过 fgets(name, sizeof name, stdin) 但它被忽略了。很遗憾,gets() 曾经如此简单,现在被笨重的东西所取代。

标签: c string gets


【解决方案1】:

因为gets() 使用起来非常危险,所以一些 C 库已经完全删除了它,并用一个什么都不做的版本替换它。

请改用fgets()

【讨论】:

  • gets 也已在 C11 中被正式删除,并在 C++ 中被弃用。
【解决方案2】:

看看gets() reference

从标准输入获取字符串

从标准输入 (stdin) 读取字符并将它们作为 C 字符串存储到 str 中,直到到达换行符或文件结尾。

如果找到换行符,则不会将其复制到 str 中。

在复制到 str 的字符之后会自动附加一个终止空字符。

请注意,gets 与 fgets 完全不同:gets 不仅使用标准输入作为源,而且在结果字符串中不包含结束换行符,并且不允许为 str 指定最大大小(这可能导致缓冲区溢出)。

所以,基本上gets() 不仅不安全(可能导致缓冲区溢出),而且还会读取输入缓冲区中的内容。

我建议你使用fgets(),但如果你想要一个快速(懒惰和愚蠢)的解决方案,只需刷新输入缓冲区:

char name[13];
printf("Profile name: ");
fflush(stdin);
gets(name);
printf("\n%s", name);

【讨论】:

  • fflush(stdin) 的调用是 C 中未定义的行为。
  • 你说得对,它应该与输出缓冲区一起使用。但是,some 编译器将fflush(stdin) 实现为扩展。它按预期工作,但会损害便携性。
  • 是的,但是语言标准将其视为未定义的行为。并且不应鼓励使用它。
【解决方案3】:

使用gets()会遇到很多麻烦

改为fgets()

fgets(name,13,stdin);  

看到这个问题Why is the gets function so dangerous that it should not be used?

fgets() 不起作用的原因可能是您没有处理 scanf 在之前的语句中留下的换行符。

您可以修改您的 scanf 格式字符串以将其考虑在内: scanf("%d *[^\n]", &N);

*[^\n] 表示忽略整数输入后不是换行符的所有内容,但不要对换行符做任何事情(跳过它)。

当您使用 scanf("%d",&num) 时,您点击了 13,enter13 存储在 num 中,当您从 stdin 读取 fgets 时,newline 字符仍在输入缓冲区中@ 它处理\n 作为你输入的数据,fgets() 语句被跳过

你不能刷新输入缓冲区但是你可以这样做fseek(stdin,0,SEEK_END);在你的每个 fgets 语句之前添加这个

【讨论】:

  • @Andre 你能把你的完整代码发给我们吗?它在这里工作
  • void createProfile() { 字符名称[13]; printf("档案名称:"); fgets(名称,13,标准输入); printf("\n%s", 名称); }
  • 您是否在代码的任何部分使用了 scanf @Andre,因为 scanf() 会准确读取您的要求;它使其他所有内容都未读,尤其是数据后面的换行符。
  • 是的,我之前用过几次。所以你是说我应该只使用 fgets?
  • 建议fgets(name, sizeof(name), stdin)
【解决方案4】:

在调用gets() 或fgets() 之前调用getchar()。由于从标准输入中的先前输入中已经存在'\n',gets() 或 fgets() 将被跳过,调用 getchar() 将导致自身被跳过,而不是 gets() 或 fgets() 或任何其他类似函数.但请记住,它更像是一种 hack 而不是标准解决方案(我认为是这样),并且还禁止使用 gets()。

        printf("\nEnter a String: ");
        getchar();
        //fgets(inputString, 100, stdin);
        gets(inputString);
        printf("\n%s", inputString);

【讨论】:

    【解决方案5】:

    将以下函数添加到您的代码中并享受它。

    string GetString()
    {
       char ch;
       string Line="";
    
       while(1)
       {
           ch=getchar();
    
           if(ch=='\n')
              break;
           else
              Line+=ch;
        }
    
        return Line;
    }
    

    这个功能也可以影响所有的空格和退格!!!

    【讨论】:

      【解决方案6】:

      使用 fflush(stdin);在获取()之前

      【讨论】:

      • 这是对我有用的解决方案,另一个没有。谢谢@Aadil Ansari
      猜你喜欢
      • 1970-01-01
      • 2017-09-22
      • 2014-02-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多