2017-05-04 6 views
1

ここでループを使いたいです。しかし、私の第二のfgetsは正しく動作しません!
第1ループでは大丈夫でした!その後、それはその2番目の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; 
} 
+5

'char second_line [2];'は、実際の文字を1つだけ保持できます。 したがって、1行に1文字と改行がある場合、改行は次のループの 'fgets'に入力されます。 – BLUEPIXY

+1

私はすでにこれを一回行いました! http://stackoverflow.com/q/43789708/7761980 – ThingyWotsit

+0

'fgets()'の各呼び出しの戻り値をチェックする必要があることに注意してください。 –

答えて

6

問題は、アレイsecond_lineが2つだけの要素を有するものとして宣言されることです。

char second_line[2]; 

したがって、このコール

fgets(second_line, 2, stdin); 

後には、入力バッファにまだなります改行文字に対応することはできません。 fgetsの最初の呼び出しでは、入力バッファー内に改行文字が存在するために空文字列が読み取られます。

少なくとも、あなたはそれが文字列である必要はないので、一般的には文字列から改行文字を削除するには、このアプローチは

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

間違っていることを考慮してください

char second_line[3]; 

//... 

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

を書く必要があります実際には改行文字が含まれています。

代わりに、二行目は、実際にこの場合は文字である

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

を書きます。 Cには文字を取り込むfgetc()があります。この場合、fgets()の代わりに使用できます。 2行目の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; 
} 
+0

詳細を教えてください。 scanf( "%d"、&k)とcC = fgetc(stdin)でどれくらいの空白/改行が取られましたか? –

+0

kは整数なので、最大整数と最小整数の境界内で数値をとります。 fgetc()は1文字しか使用しません。どちらの場合も、改行文字は入力バッファに送られます。入力バターの改行文字が次の入力ステートメントに引き継がれます。 –

+1

ここではfgets(caGarbage、sizeof caGarbage、stdin); fgetsの後(first_line、1000、stdin);改行文字を使う? @Nguai –

0

あなたは(scanf関数についての詳細を理解していない)とのfgets() ときに、入力、キーボードからのシリーズの文字を、これらの文字はなく、あなたのプロセスにinputbufで保存されました。 [Enter]を入力すると、inputbufの文字がプロセスに送信されます(最初はscanf()、2番目はfgets())、scanf()は数値を選択でき、spacebukeはinputbufを選択します。それは入力をスキップし、停止したので、 '\ n'はまだinputbufにありましたが、fgets()はまだありません。 fgets()はinputbufの任意の文字を取得し、 ''と '\ n'( '\ n'を取得している間停止します)をインクルードします。
scanf()とfgets()の違いは、それらを同時に使用するときの煩わしさでした。

関連する問題