使用scanf接受用户输入

使用scanf接受用户输入,c,C,通用条款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; } #包括 内部主(空

通用条款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;
}
#包括
内部主(空)
{
char-buf[64];
如果(1==scanf(“%63s”,buf))
{
printf(“你好%s\n”,buf);
}
其他的
{
fprintf(stderr,“输入错误”。\n”);
}
返回0;
}
我只是想知道,当有经验的程序员想要获得用户输入时,他们在使用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;
}
#包括
内部主(空)
{
字符输入_buf[64]={0};
字符数据[64]={0};
printf(“输入某物:”);
while(fgets(input_buf,sizeof(input_buf),stdin)=NULL)
{
/*分析输入的输入*/
sscanf(输入数据,“%s”);
}
printf(“输入[%s]\n”,数据);
返回0;
}
我认为大多数程序员都同意scanf是不好的,并且大多数程序员都同意使用fgets和sscanf。但是,我可以使用FGET读取输入。但是,如果我不知道用户将输入什么,我如何知道要解析什么。例如,如果用户要输入包含数字和字符的地址,并且以任何顺序输入?

scanf()会出现问题,因为如果用户希望键入一个整数,而不是键入一个字符串,则程序通常会爆炸。通过将所有输入读取为字符串(使用getchar()),然后将字符串转换为正确的数据类型,可以克服这一问题

/* example one, to read a word at a time */
#include <stdio.h>
#include <ctype.h>
#define MAXBUFFERSIZE   80

void cleartoendofline( void );  /* ANSI function prototype */

void cleartoendofline( void )
{
    char ch;
    ch = getchar();
    while( ch != '\n' )
        ch = getchar();
}

main()
{
    char    ch;                     /* handles user input */
    char    buffer[MAXBUFFERSIZE];  /* sufficient to handle one line */
    int     char_count;             /* number of characters read for this line */
    int     exit_flag = 0;
    int     valid_choice;

    while( exit_flag  == 0 ) {
        printf("Enter a line of text (<80 chars)\n");
        ch = getchar();
        char_count = 0;
        while( (ch != '\n')  &&  (char_count < MAXBUFFERSIZE)) {
            buffer[char_count++] = ch;
            ch = getchar();
        }
        buffer[char_count] = 0x00;      /* null terminate buffer */
        printf("\nThe line you entered was:\n");
        printf("%s\n", buffer);

        valid_choice = 0;
        while( valid_choice == 0 ) {
            printf("Continue (Y/N)?\n");
            scanf(" %c", &ch );
            ch = toupper( ch );
            if((ch == 'Y') || (ch == 'N') )
                valid_choice = 1;
            else
                printf("\007Error: Invalid choice\n");
            cleartoendofline();
        }
        if( ch == 'N' ) exit_flag = 1;
    }
}
/*示例一,一次读一个单词*/
#包括
#包括
#定义MAXBUFFERSIZE 80
void cleartoendofline(void);/*ANSI函数原型*/
void cleartoendofline(void)
{
char ch;
ch=getchar();
而(ch!='\n')
ch=getchar();
}
main()
{
char ch;/*处理用户输入*/
字符缓冲区[MAXBUFFERSIZE];/*足以处理一行*/
int char_count;/*此行读取的字符数*/
int exit_标志=0;
int有效_选择;
while(exit_标志==0){

printf(“输入一行文本(不要直接使用
scanf
。使用起来异常困难。最好先读取整行输入,然后对其进行解析(可能使用
sscanf

从comp.lang.c常见问题解答中阅读此条目(及其引用的条目):

编辑: 好的,请回答您自己编辑中的其他问题:如果您允许非结构化输入,则必须尝试以多种方式解析字符串,直到找到一种有效的方式。如果找不到有效的匹配项,则应拒绝输入并再次提示用户,可能需要解释您希望输入的格式加入


对于任何更复杂的问题,您最好使用正则表达式库,甚至使用专用的lexer/parser工具包(例如flex和bison).

我循环调用fgets,直到读取行的末尾,然后调用sscanf来解析数据。检查sscanf是否到达输入行的末尾是个好主意。

我很少使用
scanf
。大多数情况下,我使用
fgets()
以字符串形式读取数据。然后,根据需要,我可以使用
sscanf()
,或其他函数,如
strto*
函数族、
str*chr()
等,从字符串中获取数据

如果我使用
scanf()
fgets()
+
sscanf()
,我总是检查函数的返回值,以确保它们执行了我希望它们执行的操作。我也不会使用
strtok()
来标记字符串,因为我认为
strtok()
的接口已损坏。

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

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

if (scanf("%d", &num) == 1)
{
  // process num
}
else
{
  // handle error
}
如果用户在“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
  }
}
我可以捕获输入中的错误并在使用它的任何部分之前拒绝它。这也可以更好地避免在输入流中留下垃圾


scanf()
是一个很好的工具,如果你能保证你的输入总是格式良好的。

从不检查任何输入例程的返回代码总是可疑的-你一定很幸运。简短的回答是“我不使用
scanf()
fscanf()
;我偶尔使用
sscanf())
但要小心行事"。更新我的答案后。您通常如何使用sscanf解析数据。如果您不确定用户将输入什么数据?谢谢。您好,我已更新了我的答案。但我不确定是否使用sscanf进行解析?谢谢。您好。假设您希望用户输入他们的地址。其中包含数字和字母。您可以读入使用fgets输入。但是您如何解析输入。我认为您可以使用fgets将其读入缓冲区,就是这样。我看不出您将如何使用sscanf。谢谢。我会将邮寄地址视为所有文本,可能会分为几个字段(地址、街道名称、城市、州、邮政编码等)。何时以及如何标记它将取决于应用程序(例如,如果我需要根据邮政编码或街道名称或其他内容搜索记录)。如果我只需要将其存储以供以后显示,我可能甚至不会麻烦标记它。