使用scanf接受用户输入

ant*_*009 5 c

gcc 4.4.2

我正在阅读一篇关于scanf的文章.我个人从未检查过scanf的返回码.

#include <stdio.h>

int main(void)
{
  char buf[64];
  if(1 == scanf("%63s", buf))
  {
    printf("Hello %s\n", buf);
  }
  else
  {
    fprintf(stderr, "Input error.\n");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道当程序员在想要获得用户输入时使用scanf时会遇到的其他技术是什么?或者他们使用其他功能还是自己编写?

谢谢你的任何建议,

编辑=========

#include <stdio.h>

int main(void)
{
    char input_buf[64] = {0};
    char data[64] = {0};

    printf("Enter something: ");
    while( fgets(input_buf, sizeof(input_buf), stdin) == NULL )
    {
    /* parse the input entered */
    sscanf(input_buf, "%s", data);
    }

    printf("Input [ %s ]\n", data);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为大多数程序员都认为scanf很糟糕,大多数人同意使用fgets和sscanf.但是,我可以使用fgets来读取输入.但是,如果我不知道用户将输入什么,我怎么知道要解析什么.例如,如果用户输入的地址包含数字和字符,并且按任何顺序排列?

jam*_*lin 6

不要scanf直接使用.它的使用令人惊讶.最好读取整行输入然后解析它(可能带有sscanf).

从comp.lang.c FAQ中读取此条目(以及它引用的条目):http: //c-faq.com/stdio/scanfprobs.html

编辑:好的,从您自己的编辑中解决您的其他问题:如果您允许非结构化输入,那么您将不得不尝试以多种方式解析字符串,直到找到有效的字符串.如果找不到有效匹配,则应拒绝输入并再次提示用户,可能会解释您希望输入的格式.

对于任何更复杂的事情,你可能最好使用正则表达式库,甚至使用专用词法分析器/解析器工具包(例如flex和bison).


Joh*_*ode 5

我不scanf()用于交互式用户输入; 我使用文本读取所有内容fgets(),然后根据需要解析输入,使用strtol()strtod()将文本转换为数值.

scanf()跌倒的一个例子是用户输入错误的数值,但其初始部分有效,如下所示:

if (scanf("%d", &num) == 1)
{
  // process num
}
else
{
  // handle error
}
Run Code Online (Sandbox Code Playgroud)

如果用户键入"12e4",scanf()将成功转换并将"12"分配给num,在输入流中留下"e4"以填写将来的读数.在整个输入应被视为假,但scanf()不能赶上那种错误的.OTOH,如果我这样做:

if (fgets(buffer, sizeof buffer, stdin))
{
  int val;
  char *chk;
  val = (int) strtol(buffer, &chk, 10);
  if (!isspace(*chk) && *chk != 0)
  {
    // non-numeric character in input; reject it completely
  }
  else
  {
    // process val
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以捕获输入中的错误并在使用它的任何部分之前拒绝它.这也可以更好地避免在输入流中留下垃圾.

scanf()如果您能保证您的输入总是格式良好,那么这是一个很好的工具.