为什么这只读取n-1个字符串?

时间:2014-12-12 18:28:16

标签: c arrays string memory-management

我想编写一个程序来读取和写入(向stdout)一组不同的字符串 我的程序出了什么问题,因为它只读取n-1个字符串而不是给定的n?

#include <stdio.h>
#include <stdlib.h>
int main()
{
     char** vectorschar;
     int n,i;
     char c;
   printf("n: ");
   scanf("%d",&n);
   vectorschar=(char**)calloc(n,sizeof(char*));
   for(i=0;i<n;i++)
   {
       vectorschar[i]=(char*)calloc(30,sizeof(char));
   }
   for(i=0;i<n;i++)
   {
       gets(vectorschar[i]);
   }
   for(i=0;i<n;i++)
   {
       puts(vectorschar[i]);;
   }
return 0;
}

2 个答案:

答案 0 :(得分:3)

行后

scanf("%d",&n);
执行

后,新行字符'\n'将保留在流中。首次调用gets()时会使用它。

您可以使用以下方式跳过换行符:

scanf("%d%*[^\n]",&n);
getchar();

答案 1 :(得分:1)

您需要刷新stdin信息流,以避免'\n'字符出现gets()来电。 您可以将\n添加到scanf()这样的电话中来实现:

scanf("%d\n", &n);

编辑:是的,scanf()gets()更受欢迎。

EDIT2:正如chux所指出的那样,只有在遵守输入格式的情况下它才能正常工作。否则,\n字符之前的所有非格式化数据仍将保留在缓冲区中,从而影响您的gets()调用。为避免这种情况,请使用this示例。