我有一系列句子,我想先用fgets()
扫描它们,然后逐个打印。这是程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[]) {
char sentence[100][100]; /* 100 sentences with at most 100 characters*/
int n,i,j;
scanf("%d",&n); /* number of sentences*/
for (i=0;i<n;i++) {
fgets(sentence[i],100,stdin);
}
printf("****************************");
for (i=0;i<n;i++) {
for(j=0;j<strlen(sentence[i]);j++) {
putchar(sentence[i][j]);
}
}
return 0;
}
问题是这只能扫描n-1个句子。这是为什么?
另一个奇怪的事情是,在打印星号之后,它开始在新行上打印,而我没有告诉它这样做。
答案 0 :(得分:1)
假设输入是
3 abc def ghi
扫描n后,光标停留在第一行的数字3
之后。
您可以在%d
之后添加空格,例如scanf("%d ", &n);
,将光标移动到下一行。 (这假设第一句不以空格开头)。
取决于您的环境是否(Windows / Unix),以及您是否希望每个字符串都保留行尾字符,您需要将缓冲区大小增加到:
例如,如果您错误地将101用于Windows,则输入以下内容
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
输出结果为:
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
(有一些空行)
答案 1 :(得分:1)
两个案例都将由一个概念解决,fgets()
将newline
视为输入的一部分。
问题1:
输入缓冲区中有一个newline
(由于第一次输入后按下ENTER键),紧接着是下一个fgets()
。
解决问题1:
使用
scanf("%d%*c",&n); //simple solution
或
scanf("%d",&n);
while (getchar() != '\n'); //eat up anything upto newline
清除尾随换行符。
问题2:
fgets()
扫描并存储newline
作为输入的每个。如果您不希望换行符作为输入的一部分,则需要手动检查并删除换行符。
手册页中的相关引用:
[...]如果读取换行符,则将其存储到缓冲区中。 [...]
解决问题2:
sentence[strcspn(sentence, "\r\n")] = 0;
答案 2 :(得分:0)
您是否阅读了fgets的手册页?
fgets() 从流中读取最多一个小于大小的字符 ,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。
所以你的代码应该是chux所指出的:
fgets(sentence[i],sizeof sentence[i],stdin);