我正在尝试取一个字符串并将其分解为“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;
}
答案 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()
我不是在分析代码之外的代码;这一切都错了。