1

標準入力から1行の文字列を読み取るCプログラムを書いています。次に、1行の文字列を逆順に出力します。

逆配列は出力せず、通常の配列を出力します。

誰でも私を助けることができますか?私は何を間違っていますか?

main()
{

    int count;
    int MAX_SIZE = 20;
    char c;
    char arr[MAX_SIZE];
    char revArr[MAX_SIZE];

    while(c != EOF)
    {
        count = 0; 
        c = getchar();
        arr[count++] = c;

        getReverse(revArr, arr);

        printf("%s", revArr);

        if (c == '\n')
        {
            printf("\n");
            count = 0; 
        }
    }
}


void getReverse(char dest[], char src[])
{


    int i, j, n = sizeof(src); 

    for (i = n - 1, j = 0; i >= 0; i--)
    {
        j = 0;
        dest[j] = src[i];
        j++;    
    }
}
4

6 に答える 6

4

そこにはかなりの問題があります。getReverse()1 つ目は、 で使用する場合のスコープにプロトタイプがないことですmain()。プロトタイプを提供するか、それを認識getReverse()できるように上に移動する必要があります。main()main()

2 つ目は、すべての文字が入力された後に文字列を逆にしようとしており、入力方法が正しくないという事実です (c文字を取得する前に不確定要素をチェックします)。次のようなものの方が良いでしょう:

count = 0;
c = getchar();
while (c != EOF) {
    arr[count++] = c;
    c = getchar();
}
arr[count] = '\0';

これにより、末尾に改行があるにもかかわらず、適切な C 文字列が得られます。また、仕様に一致しない複数行の文字列でさえある可能性があります (「標準入力から 1 行の文字を読み取る」)。改行またはファイルの終わりで入力を終了させたい場合は、代わりにこれを使用できます。

count = 0;
c = getchar();
while ((c != '\n') && (c != EOF)) {
    arr[count++] = c;
    c = getchar();
}
arr[count] = '\0';

さらに、可能なすべての文字マーカーを格納できる必要があるため、c実際にはintではなく である必要があります。charEOF

関数getReverse()にも問題があります。主に、配列の最後に文字列終了マーカーを配置していないという事実だけでなく、間違ったサイズを使用しているため (sizeofではなく) 、ループを介して毎回strlen再初期化するように見えるためです。j. いずれにせよ、大幅に単純化できます。

void getReverse (char *dest, char *src) {
    int i = strlen(src) - 1, j = 0;
    while (i >= 0) {
        dest[j] = src[i];
        j++;
        i--;
    }
    dest[j] = '\0';
}

または、熟練したコーダーになったら:

void getReverse (char *dest, char *src) {
    int i = strlen(src) - 1, j = 0;
    while (i >= 0)
        dest[j++] = src[i--];
    dest[j] = '\0';
}

各行の文字を反転させるメイン プログラムが必要な場合は、次のようにして実行できます。

int main (void) {
    int count;
    int MAX_SIZE = 20;
    int c;
    char arr[MAX_SIZE];
    char revArr[MAX_SIZE];

    c = getchar();
    count = 0;
    while(c != EOF) {
        if (c != '\n') {
            arr[count++] = c;
            c = getchar();
            continue;
        }
        arr[count] = '\0';
        getReverse(revArr, arr);
        printf("'%s' => '%s'\n", arr, revArr);
        count = 0;
        c = getchar();
    }

    return 0;
}

サンプルの実行では、次のことが示されます。

pax> ./testprog
hello
'hello' => 'olleh'
goodbye
'goodbye' => 'eybdoog'
a man a plan a canal panama
'a man a plan a canal panama' => 'amanap lanac a nalp a nam a'
于 2013-05-30T04:34:09.370 に答える
3

「count」変数は、while ループが実行されるたびに 0 になります。

于 2013-05-30T04:36:29.617 に答える