该程序如何在C中输出此输出

时间:2011-10-24 12:06:40

标签: c

我在C中有一段代码。但是我无法理解它的输出

#include<stdio.h>
main()
{

char a1[20];
char a2[30];
char a3[40];
scanf("%s",&a1);
gets(a2);
fgets(a3,sizeof(a3),stdin);
printf("%d,%d,%d\n",strlen(a1),strlen(a2),strlen(a3));
 }   

当我输入我的输入时

 amit
 singh

输出为4,0,6,fgets doest不允许我输入任何字符串,我只能输入2个输入?

3 个答案:

答案 0 :(得分:3)

  1. 输入为"amit\nsingh\n"
  2. scanf消耗“amit”(并将其写入a1
  3. gets消耗“\ n”(并将空字符串写入a2
  4. fgets消耗“singh \ n”(它写入a3
  5. 输出正确。

    请勿 EVER 使用gets

    1. http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html
    2. http://pubs.opengroup.org/onlinepubs/9699919799/functions/gets.html
    3. http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html

答案 1 :(得分:2)

scanf在流中留下'\ n',由gets读取。 获取不计算\ n的长度。因此你在那里得到0。 然后你的fgets读取“singh”并且因为它确实考虑了换行符,它输出6。

请查看以下参考资料,以便更好地理解:

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

http://www.cplusplus.com/reference/clibrary/cstdio/gets/

答案 2 :(得分:2)

scanf()使用 amit 并将其存储在数组a1中。

由于scanf()系列的函数将换行符留在输入缓冲区中,而gets()读取换行符字符(它立即找到),它会存储一个将空字符串转换为a2

因此,对fgets()的调用将 singh 读入a3fgets()还将换行符添加到目标变量中 - 这就是为什么你会看到a3的6个字符作为字符串长度的原因。

由于没有更多输入命令,因此不会读取第3行。