如何在循环中使用fgets?

时间:2017-05-04 21:57:18

标签: c string loops for-loop fgets

我想在这里使用循环。但我的第二个fgets不能正常工作!
在第一个循环中它没关系!但在那之后它会跳过它的第二个fgets!
怎么解决?
感谢

#include<stdio.h>
#include<string.h>
int main (void)
{
char first_line[1000];
char second_line[2];
int i,n,j,k;
int count=0,flag=0;
scanf("%d ",&k);
for(int m=0; m<k; m++)
{
    fgets(first_line, 1000, stdin);
    fgets(second_line, 2, stdin);
    for(i=0; i<strlen(first_line); i++)
    {
        if(second_line[0]==first_line[i])
        {
            flag=1;
            count++;
        }
    }
    first_line[strlen(first_line)-1] = '\0';
    if(flag==1)
        printf("Occurrence of '%c' in %s = %d",second_line[0],first_line,count);

    else
        printf("%c isn't present",second_line[0]);
    count=0;
    flag=0;
}

return 0;
}

3 个答案:

答案 0 :(得分:6)

问题是数组second_line被声明为只有两个元素。

char second_line[2];

这次通话后

fgets(second_line, 2, stdin);

它无法容纳仍将在输入缓冲区中的新行字符。由于输入缓冲区中存在新行字符,fgets的第一次调用读取空字符串。

至少你应该写

char second_line[3];

//...

fgets(second_line, sizeof( second_line ), stdin);

考虑到通常这种从字符串中删除新行字符的方法是错误的

first_line[strlen(first_line)-1] = '\0';

因为字符串确实不需要包含换行符。

改为写

first_line[ strcspn( first_line, "\n" ) ] = '\0';

答案 1 :(得分:0)

在这种情况下,第二行实际上是一个字符。 C中有fgetc(),它接受一个字符。在这种情况下,可以使用它来代替fgets()。除了第二行的fgets()问题外,scanf(“%d”,)语句也存在问题。格式说明符后面的空格会导致您不期望的行为。此外,输入数字值后输入的换行符也会导致跳过提示行为。 这可能不是最佳解决方案,但以下代码可解决此跳过提示行为。 scanf()和fgetc()之后有fgets(caGarbage,sizeof caGarbage,stdin)语句。此语句使用换行符,从而解决了这种跳过提示行为。

 #include<stdio.h>
 #include<string.h>

 int 
 main(void)
 {
     char first_line[1000];
     char cC;
     char caGarbage[50];
     int i,n,j,k;
     int count=0,flag=0;

     printf("Enter count:");
     scanf("%d",&k);
     fgets( caGarbage, sizeof caGarbage, stdin);//Consumes newline character.

     for(int m=0; m<k; m++)
     {
         printf("Insert first line:");
         fgets(first_line, 1000, stdin);

         printf("Insert a character:");
         cC = fgetc( stdin );

         fgets( caGarbage, sizeof caGarbage, stdin); //Consumes newline character

         for(i=0; i<strlen(first_line); i++)
         {
            if(cC == first_line[i])
            {
                flag=1;
                count++;
            }
         }

         first_line[strcspn( first_line, "\n" )] = '\0';

         if(flag==1)
            printf("Occurrence of '%c' in %s = %d",cC,first_line,count);
         else
            printf("%c isn't present",cC);

         printf("\n");

         count=0;
         flag=0;
     }

     return 0;
 }

答案 2 :(得分:0)

您不了解有关scanf()和fgets()的详细信息   当您从键盘输入一个系列字符时,这些字符会保存在inputbuf中,而不是保存到您的进程中。当你输入[Enter]时,inputbuf中的字符被发送到你的进程(第一个是scanf(),第二个是fgets()),scanf()可以选择数字,空格键形成inputbuf。但是它跳过了Enter和stoped,所以'\ n'仍然在inputbuf中,但是fgets()没有。 fgets()获取inputbuf中的任何char,包括''和'\ n'(它在设置'\ n'时停止)。
  当你同时使用它们时,scanf()和fgets()之间的区别是一种烦恼。