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

问题描述 投票:0回答:1

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

#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;
}

输出:

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作为输入时,程序反复打印输出:

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
...

您认为这是怎么回事?预先感谢

c string scanf
1个回答
0
投票

通过简单参考man scanf进行解释。在您的第一种情况下:

scanf ("%19s",str);

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

第二种情况:

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

格式字符串正在寻找文字"name="作为输入的一部分,由于先前的输入之后剩余的'\n'没有被使用,因此发生了[[匹配失败,因为您的输入实际上是"\nname=...",此时字符提取停止,从而使输入缓冲区中的字符未被读取-导致每个后续输入都发生相同的故障。

您可以解决问题,在

格式字符串

的开头包含一个空格,从而导致任何前导空格都被使用:scanf (" name=%19s",str);
现在您可以输入,例如:

name=Gary name=Tom ...

© www.soinside.com 2019 - 2024. All rights reserved.