-1

何らかの理由で、これを機能させることができません。どこが間違っているのか誰か教えてもらえますか? これは、指定された文字列内の単語を逆にすることになっています (つまり、"this is a test" から "test a is this" へ)。

    #include <stdio.h>
#include <stdlib.h>

char *reverse(char const *input)
{
    char *ret = (char *)malloc(sizeof(char) * strlen(input));
    int length = 0;
    int numWords = 1;
    int i;
    for(i=0; input[i]!=NULL; i++)
    {
        length++;
        if(input[i]==' ')
            numWords++; 
    }
    char words[numWords];
    int currentWord = numWords;
    for(i=0; input[i]!=NULL; i++)
    {
        if (input[i]==' '){
            currentWord--;
        }else{
            words[currentWord] = words[currentWord] + input[i];
        }
    }
    for(i=0; i < numWords; i++)
    {
        ret = ret + words[i];
    }

    return ret;
}

int main(int argc, char **argv)
{
    int nTestcase = 0;
    int i = 0;
    char inputstr[100];
    char *reversedStr = NULL;
    scanf("%d\n", &nTestcase);
    for (i = 0; i < nTestcase; i++)
    {
        fgets(inputstr, 100, stdin);
        reversedStr = reverse(inputstr);
        printf("%s\n", reversedStr);
        free(reversedStr);
        memset(inputstr, 0, 100);
    }
    return 0;
}
4

3 に答える 3

1
words[currentWord] = words[currentWord] + input[i];

文字列の連結を期待するように、文字を相互に追加することはできません。words単語の配列 (つまり、文字列)を期待していると思いますが、その型はそうではなく、words単なる文字の配列です。

@Tomが言ったように、最後のforループでこれをもう一度やっています:

ret = ret + words[i];
于 2013-02-16T04:43:42.980 に答える
0

Joseph さんは、他のプログラミング言語 ( c# や PHP ) とは異なり、C の文字列処理関数は非常に基本的なものです。

文字列を直接追加することはできませんが、同じタスクを実行するために使用できる多数のライブラリ関数があります。

チェックアウト、

  • strtok - 文字列を単語に分割するために使用します。strtok リファレンス

  • strncat - 文字列の連結に使用

C の文字列は、ヌル文字 (値が 0 のバイト) で終了する単なるバイト配列です。

于 2013-02-16T06:18:13.923 に答える