在书写输入多个字符串时,我使用了gets函数与循环的形式,但是发现若我想要输入n个字符串但是每次都只有n-1个字符串输入成功,如下代码,我希望输入多个字符串最后输出第一个字符串。
#include <stdio.h>
#include <string.h>
int main() {
char arr[10][100];
int row;
printf("您要比较多少个字符串:");
scanf("%d", &row);
printf("\n");
char(*parr)[100] = arr;
int i;
printf("请输入字符串:\n");
for (i = 0; i < row; i++) {
gets(*(parr + i));
}
printf("第一行字符为:%s\n", parr);
}
最后输出结果如下:
最终实际上输出了一个换行符。
最后发现应该是前面的scanf函数的问题,scanf会在读取到换行符时进行输入,但不会清空缓存区,所以最后还有一个换行符在缓存区中,则当i=0时gets函数将换行符看作了字符串进行输入了。
为解决缓冲区中剩余的换行符目前搜到有四种方法:
(1)使用fflush函数:即在下一次输入前加入一行
fflush(stdin);
用于清空缓冲区,但这个方法在vs2015之后的版本似乎不起作用
(2)使用scanf除去特定的符号:同上,加入
scanf("%*c");
会清除掉缓冲区中的换行符
(3)使用getchar与while:同上,加入
while((c=getchar()) != '\n');
此方法会完全清空缓冲区(getchar一直读取直到将换行符读取掉后结束)
(4)使用rewind函数,rewind会使指定流的读写指针重新指向开头(不懂,后面再查),同上,加入
rewind(stdin);