猿问

当格式字符串的末尾有一个换行符时,扫描为什么要求两次输入?

当格式字符串的末尾有一个换行符时,扫描为什么要求两次输入?

#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”。然后它只印了一次“乔”。)


守候你守候我
浏览 618回答 3
3回答

ITMISS

从我的扫描手册页格式字符串中的空白(如空格、制表符或换行符)与输入中任何数量的空白(包括无空白)匹配。其他的一切都只匹配自己。因此.scanf ("%s\n", a)它将扫描一个字符串,后面跟着可选的空格。因为在第一个换行符之后可能会有更多的空格,扫描在第一个换行符之后不会被完成,然后查看下一步是什么。您会注意到,您可以输入任意数量的换行符(或制表符或空格),而扫描仍将等待更多。但是,当您输入第二个字符串时,空格序列将被分隔并停止扫描。使用scanf ("%s", a)若要不扫描尾随空格,请执行以下操作。

holdtom

您必须移除\n的字符串格式scanf..应该是scanf("%s",a);编辑:解释这个%s意味着扫描器读取输入字符,直到得到一个分隔符,该分隔符应该是空格、制表符或新行(\n)的第一个输入作为分隔符。"%s"并添加"\n"到字符串格式"%s\n"表示扫描将等待2条换行符,第一条换行符与"%s"第二条换行符与\n字符串格式。

慕虎7371278

"%[^\n]s"由两个指令组成:%[^\n],它要么匹配(并存储)一个或多个非‘\n’字符,要么失败,因为它立即遇到‘\n’,并且s它匹配一个文字的‘并丢弃它,或者失败并将非’s‘字符推回stdin。第一个指令将连续尝试失败,因为‘\n’不是‘s’,所以‘\n’将直接推回stdin,这是遇到的第一个字符。你自己看看:char a[64]; int n = scanf("%[^\n]s", a); assert(n == 1); n = scanf("%[^\n]s", a); assert(n == 1);
随时随地看视频慕课网APP
我要回答