2017-11-17 139 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; 
}