格式说明符%s
跳过前导空格,即任何'\n'
、' '
、'\t'
等都将被忽略,s[0]
将包含输入的第一个非空格字符。
为了演示一下scanf
中发生的情况,看看下面利用scanf
的"%n"
特性的示例,它返回已处理的字符数;我使用sscanf
使结果不依赖于用户输入。请注意,读取字符串时,scanf
处理的字符比结果中存储的多:
#include<stdio.h>
int main(void){
int n;
int pos;
char s[10];
const char* simulatedInput = "123\n abcde";
const char* inputPtr = simulatedInput;
sscanf(inputPtr,"%d%n",&n,&pos);
printf("sscanf on %s processed %d charaters; result n: %d\n", inputPtr, pos, n);
inputPtr += pos;
sscanf(inputPtr,"%s%n",s,&pos);
printf("sscanf on %s processed %d charaters; yet s as '%s' contains only %lu characters\n", inputPtr, pos, s, strlen(s));
return 0;
}
输出:
sscanf on 123
abcde processed 3 charaters; result n: 123
sscanf on
abcde processed 11 charaters; yet s as 'abcde' contains only 5 characters
"%c"
格式说明符造成问题,除非明确指示使用" %c"
来跳过前导空格。 - Weather Vanescanf
根本不关心\n
。对于scanf
来说,\n
只是另一个空格字符。 - AnT stands with Russia