2013-10-04 196 views
1

我想要一个字符串并将其分解为“字”组件并将其存储在字符串数组中。 “你好,我的名字是比尔。”应该返回一个char **元素,“你好”,“我的”,“名称”,“是”和“比尔”。返回字符串输入字符串

我的代码编译但我一直遇到一个运行时错误(我没有得到警告了我的gdb调试器不工作)>

我在窗户上的MinGW运行8

#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

什么是运行时错误?有踪迹吗?你的意思是你的gdb不起作用? –

+3

如果你不是这样做的,只是为了练习,你可能想看看[strtok](http://en.cppreference.com/w/c/string/byte/strtok)函数。它用于分割字符串。 – jpw

+0

这是给分段错误。 – haccks

回答

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也可以完成这项工作。

0

words()你正在为stringArray分配值作为一个二维数组,而在main()你正在读取它作为一个指针数组的值。这些不是一回事。

所以你需要改变它,以便你始终把它当作一个二维数组来处理,或者你一直把它当作一个指针数组来处理(准确地说就是char*)。要么会工作...看到上面的评论详细说明。

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()。

我没有分析超出这个代码;这完全错了。