0

配列を理解していないだけなのか、それとも何なのかわかりませんが、ここ数時間、このコードの問題を探していました。実行すると、リターンの無限ループが発生します。

コードは次のとおりです。

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

void reverse(char string2Reverse[80], int start, int end);

int main(int argc, char *argv[])
{
    char string[80];

    int cntr;
    for(cntr = 0; cntr < 80; cntr++)
        string[cntr] = '\0';

    int start = 0, end;

    while((scanf("s", string)) != EOF)
    {
    end = 0;
    printf("%s ", string);

    while(string[end] != '\0')
        end++;

    end--;
    reverse(string, start, end);
    end++;
    printf("%s\n\n", string);

    for(cntr = 0; cntr < end; cntr++)
        string[cntr] = '\0';
    }
}

void reverse(char string2Reverse[80], int start, int end)
{
    if(string2Reverse[start] != string2Reverse[end] && start != end)
    {
    char temp = string2Reverse[start];
    string2Reverse[start] = string2Reverse[end];
    string2Reverse[end] = temp;
    reverse(string2Reverse, start + 1, end - 1);
    }
}

どんな助けでも素晴らしいでしょう!私は自分の問題を見つけることができないようです。

4

3 に答える 3

2

end-startが偶数でない場合、startは!= end ever ..であるため、無限ループになります。また、実際にそのように比較したいかどうかもわかりません。string2Reverse[start] != string2Reverse[end]つまり、文字列内にそこに場所があるかどうかを意味します。は「a」であり、文字列の反対側のバランスの取れた位置には「a」もあり、終了します。これを試して:

void reverse(char string2Reverse[80], int start, int end)
{
    if(start < end)
    {
    char temp = string2Reverse[start];
    string2Reverse[start] = string2Reverse[end];
    string2Reverse[end] = temp;
    reverse(string2Reverse, start + 1, end - 1);
    }
}

そして、他のみんながここで指摘しているように、scanfでは「s」の代わりに「%s」が必要です。今ループしている理由は、endが-1で始まるためです(これはゼロlen文字列だったため)。したがって、明らかに開始が増加し、終了が減少しているため、終了条件が満たされることはありません。

于 2012-10-17T19:15:03.463 に答える
1

scanf文字列を読み取るためのの形式は%sです。パーセント記号が欠落しているようです。

于 2012-10-17T19:12:38.380 に答える
1

while((scanf("s", string)) != EOF)while((scanf("%s", &string)) != EOF)% と & を忘れないでください。

于 2012-10-17T19:16:04.360 に答える