scanf("%s")甚至在scanf之后使用它时存储字符串("%d")

时间:2017-06-11 20:22:06

标签: c scanf

所以我写了这段代码(忽略缓冲区溢出问题,因为这只是一个简单的例子):

#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)应该终止,但事实并非如此。输出打印字符串。

1 个答案:

答案 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