繁体   English   中英

通过 scanf() 提取输入字符串的一部分

[英]Extract part of an input string by scanf()

我通过这两个例子问我的问题,在第一个程序中,当我输入我的名字时,它可以正常工作:

#include <stdio.h>

int main ()
{
    char str [20];

    while(1)
    {
       printf ("Enter your name: ");
       scanf ("%19s",str);
       printf ("Your name is %s\n",str);
    }
    return 0;
}

Output:

Enter your name: Reza
Your name is Reza
Enter your name: 

但在以下程序中,结果并不如预期:

#include <stdio.h>

int main ()
{
    char str [20];

    while(1)
    {
        printf ("Enter your name: ");
        scanf ("name=%19s",str);
        printf ("Your name is %s\n",str);
    }
    return 0;
}

当输入name=Reza作为输入时,程序重复打印 output:

Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
...

在你看来有什么错误? 预先感谢

它通过对man scanf的简单引用来解释。 在您的第一种情况下:

scanf ("%19s",str);

%s转换说明符忽略前导空格,因此输入缓冲区 ( stdin ) 中留下的'\n'被静默消耗。

在你的第二种情况下:

scanf ("name=%19s",str);

格式化字符串正在寻找文字"name="作为输入的一部分,因为没有消耗您先前输入后留下的'\n' ,所以会发生匹配失败,因为您的输入实际上是"\nname=..." ,此时字符提取停止,输入缓冲区中的字符未读 - 导致每个后续输入都出现相同的失败。

您可以解决问题,包括格式字符串开头的空格导致任何前导空格被消耗:

scanf (" name=%19s",str);

现在您可以输入,例如:

name=Gary
name=Tom
...

(当然,如果用户输入的任何名称超过 19 个字符,或者猫不小心踩到键盘,您仍然会遇到无关字符问题)

您还必须检查使用的每个输入 function 的返回- 特别是scanf 只需检查是否发生了预期的转换次数,例如

if (scanf (" name=%19s",str) != 1) {
    fputs ("error: conversion failed.\n", stderr);
    /* handle error */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM