返回带字符串输入的字符串数组

时间:2013-10-04 23:32:42

标签: c arrays string pointers

我正在尝试取一个字符串并将其分解为“word”组件并将其存储在字符串数组中。 “你好,我的名字叫比尔。”应该用元素“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;
}

3 个答案:

答案 0 :(得分: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也可以胜任。

答案 1 :(得分:0)

words()中,您将stringArray的值指定为二维数组,而在main()中,您将其作为指针数组从中读取值。那些不是一回事。

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

答案 2 :(得分: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,要么用calloc()代替malloc()

我不是在分析代码之外的代码;这一切都错了。