3

stdin で fgets を使用して一部のデータを読み取ります。最大長は 25 です。このコードで実行しているテストの 1 つでは、必要なデータの後に数百のスペースがあります。プログラムが失敗します。

fgets を使用するときにこれらの余分なスペースをすべて無視して次の行に移動する方法について、誰かが私にアドバイスできますか?

4

3 に答える 3

2

繰り返し使用fgets()し、文字列をスキャンして、すべてがスペースかどうか (および改行で終わるかどうか) を確認し、スペースの場合は無視します。または、代わりにgetc()orgetchar()をループで使用しますか?

char buffer[26];

while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    ...process the first 25 characters...
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        ;
}

そのコードは、次の改行までのすべての文字を単純に無視します。それらがスペースであることを確認したい場合は、(内側の)ループにテストを追加しますが、文字がスペースでない場合にどうするかを決定する必要があります。

于 2010-03-20T04:19:53.687 に答える
0

getc() に関する Jonathan Leffler の提案を詳しく説明します。

次のようなループがあるとします。

while (!feof(stdin)) {
  fgets(buf, 25, stdin);
  ...
}

次のように変更します。

while (!feof(stdin)) {
  int read = fgets(buf, 27, stdin);
  if (read > 26) { // the line was *at least* as long as the buffer
    while ('\n' != getc()); // discard everything until the newline character
  }
  ...
}

編集: ああ、ジョナサンは私が C を書くよりも速い. :)

于 2010-03-20T04:26:09.790 に答える
0

末尾のスペースを削除するには、このコードを試してください。

 char str[100] ;
    int i ;
    fgets ( str , 80 , stdin ) ;
    for ( i=strlen(str) ; i>0 ; i-- )
    {
            if ( str[i] != ' ' )
            {
                    str[i+1]='\0';
                    break ;
            }
    }
于 2010-03-20T04:32:13.797 に答える