1

文字列を取得して「単語」コンポーネントに分割し、それを文字列の配列に格納しようとしています。「こんにちは、私の名前はビルです。」要素「Hello」、「my」、「name」、「is」、および「Bill」を含む char** を返す必要があります。

コードはコンパイルされますが、実行時エラーが発生し続けます (警告が表示されなくなり、デバッガー gdb が機能しません)>

Window 8 で minGW を実行しています。

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

char** words(char* string)
{
    int i = 0;
    int j = 0;
    int k =0;
    int count = 0;

    char** stringArray = (char**) malloc(sizeof(char)*30*30);

    while( string[i] != '\0' )
    {
        if(string[i] != ' ')
        {
            j =0;
            while(string[i+j+1] != ' ')
            {
                j++;
            }
            i = i+j;
            for(k=0; k<=j; k++)
            {
                stringArray[count][k] = string[i+k];
            }
            count++;        
        }
        i++;
    }

    return stringArray;

}   
int main()
{   
    char message[20] = "abcd efgh ijkl mno";

    char** wordArray = words(message);

    printf("%c\n\n", wordArray[0][0]);

    int i =0;
    while(wordArray[i])
    {
        printf("%s\n", wordArray[i]);
        i++;
    }
    printf("\nThe problem is not with the words function");

    return 0;
}
4

3 に答える 3

0

では値を2 次元配列としてwords()代入し、そこからポインターの配列として値を読み取ります。それらは同じものではありません。stringArraymain()

したがって、一貫して2D配列として扱うように、または一貫してポインタの配列として扱うように変更する必要があります(char*正確には)。どちらでも機能します...詳細については、上記のコメントを参照してください。

于 2013-10-04T23:52:52.903 に答える
0

このコードはすべて間違っています。

char** stringArray = (char**) malloc(sizeof(char)*30*30);

まず第一に、sizeof(char)常に 1 です。第二に、ボイドをキャストする必要はありません。そう:

char **stringArray = malloc(30 * 30);

しかし、それは の配列であるため意味がありませんchar *。したがって、それに関して割り当てる必要があります。

char **stringArray = malloc(sizeof(char *) * 30);

またはさらに良い:

char **stringArray = malloc(sizeof(*stringArray) * 30);

これで 30 の配列ができましchar *たが、それぞれが初期化されていないため、次のようにする必要があります。

for (i = 0; i < 30; i++)
    stringArray[i] = malloc(sizeof(**stringArray) * 30);

そうしないとstringArray[count][k]にアクセスできません。

次に、配列の最後の要素が NULL であると仮定しますが、それを設定することはありません。したがってstringArray[count] = NULL、words() の最後で行うか、malloc() の代わりに calloc() を行います。

それ以上のコードは分析していません。それはすべて間違っています。

于 2013-10-05T00:08:31.587 に答える