2013-10-04 249 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()。

我沒有分析超出這個代碼;這完全錯了。