【问题标题】:C input problemsC 输入问题
【发布时间】:2011-02-25 01:57:16
【问题描述】:

我正在尝试用 C 创建一个简单的程序。这是我目前掌握的基础知识

#include <stdio.h>
int main()
{
  char input[256];
  while(1)
  {
    printf("Input: ");
    scanf("%s", input);
    if(strcmp(input, "help") == 0)
      printf("HELP STUFF HERE\n");
    else if(strcmp(input, "1") == 0)
      printf("2\n");
    else if(strcmp(input, "test 1") == 0)
      printf("Test 1\n");
    else if(strcmp(input, "test 2") == 0)
      printf("Test 2\n");
    else
      printf("Error");
    }
  return 0;
}

不过我遇到了一些问题。首先我不能使用空格。如果我尝试测试 1,我会得到 Error 的输出。我遇到的第二个问题是当它输出错误时,它会将其打印到用户输入提示中

【问题讨论】:

    标签: c input scanf


    【解决方案1】:

    简单的答案是将scanf 中的"%s" 更改为"%[^\n]",它会读取除换行符以外的所有字符。

    更好的答案是将其更改为"%255[^\n]",它的作用相同,但包括边界检查。

    最好的答案是使用fgets,它不会有关于它究竟会读什么的时髦问题,或者很难进行正确的边界检查。

    【讨论】:

    • 这是我第一次看到这样的 scanf 格式说明符。它看起来像一个正则表达式。这甚至是标准吗?
    • 嗯,我已经尝试了你给我的前两个建议,当我输入 1 时,它会一遍又一遍地打印 2,等等。我会更多地研究 fgets。
    • @AustinM - 是的。 (我第一次听到的时候也很怀疑。)
    • @AustinM - 这是scanf 的烦恼的一部分。我认为" %255[^\n]" 可以解决这个问题,但不是很精确(它会在文本开始之前占用空格)。 fgets 仍然是恕我直言的最佳解决方案。
    • 我现在遇到了 fgets() 的问题。如果我使用 gets() 它工作正常。但是如果我使用 fgets(input, 256, stdin);它每次都打印错误。
    【解决方案2】:

    这是因为当您编写 scanf('%s') 时,在输入 test 1 上,%s 只会扫描到第一个空格,而您的程序接收的输入实际上只是 test

    在调试方面有用的事情是做一个

    printf("Error: %s", input)
    

    这样你就可以看到scanf 给你带来了什么。

    如果你只想输入整行,fgets() 更好用。

    【讨论】:

    • 从不使用gets,只使用fgets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多