1

入力のすべての行を逆にするプログラムを作成しています。

これは私のコードです:

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

int main()
{
    char c[100];

    while((fgets(c,100,stdin)) != NULL)
    {
        c[strlen(c) - 1] = '\0';
        for(int i=strlen(c); i>=0; i--)
        {
            printf("%c",c[i]);
        }
    }
}

私のテスト入力:

abc 123
lorem ipsum
dolor sit amet

最初の行を反転して印刷できます。

abc 123
321 cba

しかし、入力の次の行を入力し始めると、それは逆の入力の隣にあるため、テスト入力に対して実行される完全なプログラムは次のようになります。

abc 123
321 cbalorem ipsum
muspi meroldolor sit amet
tema tis rolod

次のようになります。

abc 123
321 cba
lorem ipsum
muspi merol
dolor sit amet
tema tis rolod

回避策として、出力の後にもう一度押しEnterて、次の入力行を別の行に入力できるようにしますが、なぜそれを行う必要があるのか​​ わかりません。

4

1 に答える 1

2

あなたのコードは、言われたことを正確に実行します。したがって、逆文字列の直後に改行文字が必要な場合は、forループの直後に次を使用します。

putchar('\n');

c[strlen(c) - 1]また、改行文字であるという保証はないことに注意する必要があります。したがって、次のように置き換える前に確認してください'\0'

size_t len = strlen(c);
if(len && c[len - 1] == '\n')
    c[len - 1] = '\0';

また、C89 に行き詰まっている場合は、から値を返す必要があるかもしれませんmain。追加するだけ

return 0; /* Usually, 0 indicates success */

main警告を取り除くためにの最後に:

source_file.c: In function ‘main’:
source_file.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

return 0;C99以降では暗黙的であることに注意してください。

于 2016-04-03T04:32:28.367 に答える