2017-11-17 134 views
-1

我需要編寫一個將字符串分割爲單個單詞的函數。
我的第一個參數是一個字符串。我們假設字符串中的單詞由單個空格分隔,在第一個單詞之前或第二個單詞之後沒有空格。像空格這樣的標點符號就是一個單詞的一部分。我的第二個參數是一個整數的地址,其中函數給出了字符串中單詞數量的值。返回值是一個指針,指向包含句子中單個單詞的字符串數組的點。我需要從堆中分配內存,並在數組的每個索引中都有一個字。字符串是原始單詞的副本,而不是指針。這裏是我的代碼:來自分割字符串函數的分割錯誤

char** splitString(char theString[], int *arraySize) { 
    *arraySize = countSpaces(theString) + 1; //Points to the number of words in the string. 
    char** pointerToArrayOfStrings = malloc(*arraySize * sizeof(char *)); //Allocated memory for '*arraySize' character pointers 
    int characters = 0; 
    for (int i = 0; i < *arraySize; i++) { 
    while (theString[characters] != ' ' || theString[characters] != '\0') { 
     characters++; 
    } 
    characters++; 
    pointerToArrayOfStrings[i] = (char *)malloc(characters); 
    pointerToArrayOfStrings[i][characters] = '\0'; 
    } 
    for (int word = 0; word < *arraySize; word++) { 
    int ch = 0; 
    while (ch < strlen(pointerToArrayOfStrings[word])) { 
     pointerToArrayOfStrings[word][ch] = theString[ch]; 
    } 
    ch+=2; 
    } 
    return pointerToArrayOfStrings; 
} 

這是立即給我分段錯誤。我對指針非常陌生,所以我的方法是首先爲數組分配「numberOfWords」字符指針的內存量。然後我爲每個字符指針分配了相應單詞的大小。之後,我用原始字符串中的字符填充了插槽。我不知道我錯過了什麼。

+1

您有無限循環在這裏:'而(theString [字符] = '' || theString [字符] =! '\ 0'!){' – dbush

+0

大部分'pointerToArrayOfStrings [i] []'沒有在'strlen(pointerToArrayOfStrings [word])之前被賦值' – chux

+0

'pointerToArrayOfStrings [i] =(char *)malloc(characters); pointerToArrayOfStrings [i] [characters] ='\ 0';'分配外部分配的內存。 – chux

回答

0

的意見已經解決您關於賽格故障等問題,但既然你沒有說出來是需要如何你分割字符串,我想建議在尋找另一種方法。

考慮採用以下步驟:

1)穿行的空白(字)串計數事件和跟蹤發現最長的單詞。 2)知道計數,最長的單詞,你有你需要分配的內存。做到這一點。
3)在for循環中,使用strtok(),並使用以下分隔符:,\n,\t等來標記字符串。
4)使用strcpy()(也在循環中)將每個令牌轉移到字符串數組中。
5)返回數組。使用數組。釋放所有分配的內存。

實施例的代碼來執行下列步驟:

char** splitString(const char theString[], int *arraySize); 
char ** create_str_array(int strings, int longest) ; 

int main(void) 
{ 
    int size; 
    char ** string = splitString("here is a string", &size); 

    return 0; 
} 

char** splitString(const char theString[], int *arraySize) 
{ 
    *arraySize = strlen(theString) + 1; //Points to the number of words in the string. 
    char *tok; 
    char *dup = strdup(theString);//create copy of const char argument 

    char** pointerToArrayOfStrings = NULL; 
    int characters = 0; 
    int len = 0, lenKeep = 0, wordCount = 0, i; 

    /// get count of words and longsest string 
    for(i=0;i<*arraySize;i++) 
    { 
     if((!isspace(theString[i]) && (theString[i]))) 
     { 
      len++; 
      if(lenKeep < len) 
      { 
       lenKeep = len; 
      } 
     } 
     else 
     { 
     wordCount++; 
     len = 0; 
     } 
    } 

    /// create memory. (array of strings to hold sub-strings) 
    pointerToArrayOfStrings = create_str_array(wordCount, lenKeep); 
    if(pointerToArrayOfStrings)// only if memory creation successful, continue 
    { 
     /// parse original string into sub-strings 
     i = 0; 
     tok = strtok(dup, " \n\t"); 
     if(tok) 
     { 
      strcpy(pointerToArrayOfStrings[i], tok); 
      tok = strtok(NULL, " \n\t"); 
      while(tok) 
      { 
       i++; 
       strcpy(pointerToArrayOfStrings[i], tok); 
       tok = strtok(NULL, " \n\t"); 
      } 
     } 
    } 

    /// return array of strings 
    return pointerToArrayOfStrings; 
} 

char ** create_str_array(int strings, int longest) 
{ 
    int i; 
    char ** a = calloc(strings, sizeof(char *)); 
    for(i=0;i<strings;i++) 
    { 
     a[i] = calloc(longest+1, 1); 
    } 
    return a; 
}