所以我写了这段代码(忽略缓冲区溢出问题,因为这只是一个简单的例子):
#include<stdio.h>
int main(void){
int n;
char s[10];
printf("Enter a number: ");
scanf("%d",&n);
scanf("%s",s);
printf("%s",s);
return 0;
}
字符串不应存储在数组中,因为应该有一个&#34; \ n&#34;在输入缓冲区中,因此scanf(&#34;%s&#34;,s)应该终止,但事实并非如此。输出打印字符串。
答案 0 :(得分:3)
格式说明符%s
会跳过前导空格,即任何'\n'
,' '
,'\t'
,...都将被忽略,s[0]
将包含第一个输入的非空格。
为了演示scanf
中的一些内容,请参阅以下示例,该示例使用"%n"
- scanf
的功能,该功能会返回包含的字符数到目前为止已被处理;我使用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; // inputPtr will point at the position of '\n'
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