Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
520 views
in Technique[技术] by (71.8m points)

c - The scanf function, the specifer %s and the new line

I read into C11 standard this:

Input white-space characters (as speci?ed by the isspace function) are skipped, unless the speci?cation includes a [, c, or n speci?er.

so I understand that if I use that specifiers the next scanf can contains for example a new line.

But if I write this:

char buff[5 + 1];
printf("Input: ");
scanf("%10s", buff);

printf("Input: ");

char buff_2[5 + 1];
scanf("%[abcde]", buff_2);

and then I input, i.e., RR and then Return, the next scanf fails because of .

So also %s doesn't discard a new line?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

%s consumes everything until a whitespace character and discards leading whitespace characters not trailing ones. The [ conversion specifier in the second scanf does not skip leading whitespace characters and therefore, fails to scan because of the newline character(which is a whitespace character) left over by the first scanf.

To fix the issue, either use

int c;
while((c=getchar())!='
' && c!=EOF);

After the first scanf to clear the stdin or add a space before the format specifier(%[) in the second scanf.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...