-1

これが私のコードです:

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

void ignoreRestOfLine(FILE* fp)
{
   int c;
   while ( (c = fgetc(fp)) != EOF && c != '\n');
}


int main( void )
{
    int num_times, count =0;
    int length;
    scanf("%d ", &num_times);
    char s[100];
  for(count=0 ;count<num_times;count++){

    if ( fgets(s, sizeof(s), stdin) == NULL )
    {
       // Deal with error.
    }

    if ( scanf("%d", &length) != 1 )
    {
       // Deal with error.
    }

    ignoreRestOfLine(stdin);

    size_t n = strlen( s );
    size_t m = 5;
    int i,j;
    for (  i = 0; i < strlen(s)+1; i++ ){
        putchar( '[' );
        for (  j = 0; j < m; j++ )
        {
            char c = s[(i + j) % ( n + 1 )];
            if ( !c )
                c = ' ';
            putchar( c );
        }
        printf( "]\n" );
    }


    }
}

最初の行は、入力したい符号の数を示しています。2 行目は、記号を出力する文字列を入力する場所です。3 行目は、マーキー内のスペースの数です。例えば:

Input:
1
Hello World!
5

Output:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld! ]
[ld!  ]
[d!  H]
[!  He]
[Hel ]
[ Hell]

しかし、これは私のコードが実際に行うことです:

Input: 
1
Hello World!
5

Output:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld!
]
[ld!
 ]
[d!
 H]
[!
 He]
[
 Hel]
[ Hell]

この単純なエラーを修正するにはどうすればよいですか?

4

2 に答える 2

1

これは、 stdin から改行を読み取っているためです。回数入力では改行を無視しますが、文字列入力では無視しません。s から改行文字を切り取る必要があります。fgets 入力から末尾の改行文字を削除する

于 2016-02-27T20:18:48.760 に答える
1

これは、fgets関数がファイルの終わりまたは改行 ( \n) 文字まで行全体を読み取るためです。に達した場合は\n、それを返す前に文字列の末尾に追加します。文字列にその改行が必要ない場合 (この場合は必要ありません)、次のようなものを使用して削除する必要があります。

if (s[strlen(s)-1] == '\n')
  s[strlen(s)-1] = '\0';

これにより、改行文字が NULL バイトに置き換えられ、文字列が 1 文字だけ短くなり、コードが意図したとおりに機能するようになります。

于 2016-02-27T20:18:56.213 に答える