当格式字符串末尾有换行符时,为什么scanf要求输入两次?

时间:2013-04-01 08:21:07

标签: c scanf

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *method1(void)
{
    static char a[4];
    scanf("%s\n", a);
    return a;
}

int main(void)
{
    char *h = method1();
    printf("%s\n", h);
    return 0;
}

当我运行上面的代码时,提示符要求两次输入(我只在代码中使用scanf一次)。那是为什么?

(我输入'jo';它要求更多输入,所以我再次输入'jo'。然后它只打印出'jo'一次。)

7 个答案:

答案 0 :(得分:18)

从我的scanf手册页

  

格式字符串中的空格(如空格,制表符或换行符)在输入中匹配任意数量的空格,包括无空格。其他一切只与自己匹配。

因此,对于scanf ("%s\n", a),它将扫描一个字符串,后跟可选的空格。由于在第一个换行符之后可能会出现更多的空格,因此在第一个换行符之后不会执行scanf并查看下一个换行符。您会注意到您可以输入任意数量的换行符(或制表符或空格),scanf仍会等待更多。

但是,当您输入第二个字符串时,空格序列将被分隔,扫描将停止。

使用scanf ("%s", a)不扫描尾随空格。

答案 1 :(得分:8)

您必须从\n的字符串格式中删除scanf。它应该是

scanf("%s",a);

编辑:说明

%s表示scanf读取输入字符,直到它得到一个分隔符,该分隔符应该是空格或制表符或新行(\n)之类的空白区域,因此第一个输入是作为"%s"的分隔符并将"\n"添加到字符串格式"%s\n"意味着scanf将等待2个换行符,第一个换行符与"%s"的分隔符和第二个换行符与字符串格式的\n相关。

答案 2 :(得分:0)

使用gets()或fgets()代替......或者使用scanf(“%[^ \ n] s”,a);

答案 3 :(得分:0)

从scanf格式中删除\n并提供输入,并根据给定的输出显示输出一次。

答案 4 :(得分:0)

您可以使用以下任一方法来避免上述问题: scanf("%s",a); 要么 scanf("\n%s",a);

答案 5 :(得分:0)

试试这个:不要在 scanf 上使用 \n,它不会问你两次,有时它可能会显示错误

您的代码scanf("%s\n", a);

在 scanf 上试试这个scanf("%s", a);

答案 6 :(得分:-1)

不要在scanf stdio函数中使用转义序列

ul{
    margin:0px;
    padding:0px; 
    list-style:none;

    }

ul li{
    background-color:#5BC8C3;
    width:150px;
    height:50px;
    float:left;
    line-height:50px;
    color:#0FC;
    text-align:center;
        }
ul li a{
    color: #FFF;
    text-decoration:none;
    display:block;
    }           
ul li a:hover{
    background-color:#F7f7f7;
    }