#include <stdio.h>
#include <string.h>
#pragma
int main()
{
char s1[5];
char s2[5];
scanf("%s%s",s1,s2);//enter apple in both cases
printf("%s",s1);
}
我的问题是,输入一个大小与字符数组s1相同的字符串后,为什么s1读取空值?
答案 0 :(得分:3)
使用
scanf("%4s%4s", s1, s2);
将输入限制为4个字符,将第5个(最后一个)限制为空字符(\0
)。新代码的结果将是:
[user@so ~]$ ./a.out
Enter s1 and s2: apple apple
s1 = `appl`
s2 = `e`
这是因为scanf
继续读取完成第一个字符串的第二个字符串。由于s1
限制为4个字符,s2
的读数将从字符e
继续。
┌──────first %4s stops after reading 4 characters and
│ stores "appl" into s1
▼
a│p│p│l│e│ │a│p│p│l│e 'a'│'p'│'p'│'l'│ 0 'e'│ 0 │ ? │ ? │ ?
─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─ s1 ───┼───┼───┼───┼─── s2 ───┼───┼───┼───┼───
0│1│2│3│4│5│6│7│8│9│ 0 │ 1 │ 2 │ 3 │ 4 0 │ 1 │ 2 │ 3 │ 4
▲
│
└──────second %4s stops at the first whitespace and
stores "e" into s2
其他输入的结果:
[user@so ~]$ ./a.out
Enter s1 and s2: appleapple
s1 = `appl`
s2 = `eapp`
[user@so ~]$ ./a.out
Enter s1 and s2: abc 123456
s1 = `abc`
s2 = `1234`
答案 1 :(得分:-1)
因为当您输入字符串编译器中的任何名称时,在您输入的单词后自动将null设置为null。 它永远不会打印空