scanf("%450 [^ \ n]",str)不逐行读取

时间:2014-12-27 04:38:51

标签: c

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的堆栈溢出的帖子来逐行阅读。但似乎没有一个在我的情况下工作。我哪里出错了?

3 个答案:

答案 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中添加一些换行符,以获得良好的可读输出。