为什么s1读取空字符?

时间:2014-06-09 00:06:05

标签: c arrays string

#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读取空值?

2 个答案:

答案 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。 它永远不会打印空