1

我正在尝试获取一个字符串并将其分解为“单词”组件并将其存储在字符串数组中。“你好,我叫比尔。” 应该返回一个带有元素的 char**,“Hello”、“my”、“name”、“is”和“Bill”。

我的代码将编译,但是我一直遇到运行时错误(我不再收到警告,而且我的调试器 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

1

评论中提到了几个问题。分配应类似于:

#include <ctype.h>    // for isspace()    

#define MAXSTRLEN 30  // using a symbolic constant

char **stringArray;
int i, j, k;

stringArray = malloc(sizeof(char*) * MAXSTRLEN); // don't cast from malloc
for (i = 0; i < 30; ++i) {
  stringArray[i] = malloc(sizeof(char) * MAXSTRLEN);
}
// TODO error checking: malloc could return NULL

虽然复制子字符串看起来像:

i = 0;
j = 0;
while( string[i] != '\0')  // go through the whole string
{
    while (string[i] != '\0' && isspace(string[i])) {
     i++; // skip whitespaces
    }

    k = 0;
    while (string[i] != '\0' && !isspace(string[i])) { // copy word until whitepace or end of string
        stringArray[j][k++] = string[i++];
    }
    stringArray[j][k] = '\0'; // EOS !!!
    j++;
}

和打印(j 是实际阅读的字数):

for (i = 0; i < j/*30*/; ++i) {  // (!) how to print
    printf("%s\n", stringArray[i]);
}

而且,是strtok的,也可以完成这项工作。

于 2013-10-05T00:09:36.353 回答
0

words()您将值stringArray作为二维数组分配时,并且在main()您从它作为指针数组读取值时。这些不是一回事。

因此,您需要对其进行更改,以便始终将其视为 2D 数组,或者始终将其视为指针数组(char*准确地说)。任何一个都可以工作......请参阅上面的评论以进行详细说明。

于 2013-10-04T23:52:52.903 回答
0

这段代码全错了。

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

首先,sizeof(char)永远是一个,其次,你不需要投空。所以:

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() 的末尾做,要么用 calloc() 而不是 malloc()。

除此之外,我不会分析代码。一切都错了。

于 2013-10-05T00:08:31.587 回答