scanf("%d",&T);
printf("%d",T);
for(i=0;i<T;i++)
{
scanf("%450[^\n]",str2);
printf("%s",str2);
}
我正在尝试使用gcc编译器上的文件重定向阅读以下内容
3 // number of lines to read
// line 1 intentionally left blank(pressed enter)
hello world // line 2 to read
hello world2 // line 3 to read
但我得到以下输出
3
// blank
// blank
// blank
我已经阅读了以前关于使用各种scanf的堆栈溢出的帖子来逐行阅读。但似乎没有一个在我的情况下工作。我哪里出错了?
答案 0 :(得分:3)
如果您想阅读一行,只需使用fgets()。
fgets(str2, length, stdin);
完整的例子是:
#include <stdio.h>
#include <stdlib.h>
int main(){
int T, i;
char str2[1024];
fgets(str2, 1024, stdin);
sscanf(str2, "%d", &T);
printf("%d\n",T);
for(i=0;i<T;i++)
{
fgets(str2, 1024, stdin);
printf("%s", str2);
}
return EXIT_SUCCESS;
}
当然,如果您不能依赖输入有效,您还可以添加一些检查来验证fgets的返回值,也许可以使用strtol而不是sscanf。
答案 1 :(得分:2)
该行
scanf("%450[^\n]",str2);
将换行符留在输入流中。添加一行来读取一个字符并将其丢弃。
for(i=0;i<T;i++)
{
scanf("%450[^\n]",str2);
fgetc(stdin);
printf("%s\n",str2); // Add a newline to printf
}
更新,以回应OP的评论
在scanf("%d",&T);
之后,输入流上还有换行符。添加一行来阅读并丢弃该换行符。
更新了适用于我的功能。
int main()
{
int T;
char str2[450] = {0};
int i;
scanf("%d",&T);
// Discard everything after the number
scanf("%*[^\n]"); // Discard all but the newline
fgetc(stdin); // Discard the newline
printf("%d\n",T);
for(i=0;i<T;i++)
{
scanf("%450[^\n]",str2);
fgetc(stdin);
printf("%s\n",str2);
}
return 0;
}
答案 2 :(得分:0)
要解决您的问题,您只需在第二个\n
scanf
即可
scanf("\n%450[^\n]",str2); // note the \n before the % character
此外,您需要在函数printf
中添加一些换行符,以获得良好的和可读输出。