c - 分割字符串函数的段错误

标签 c arrays string pointers

我需要编写一个将字符串拆分为单个单词的函数。
我的第一个参数是一个字符串。我们假设字符串中的单词由单个空格分隔,第一个单词之前或第二个单词之后没有空格。例如,像空格这样的标点符号是单词的一部分。我的第二个参数是一个整数的地址,其中函数给出字符串中单词数的值。返回值是一个指针,指向包含句子中各个单词的字符串数组。我需要从堆中为其分配内存,并在数组的每个索引中都有一个单词。字符串是原始单词的副本,而不是指针。这是我的代码:

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) 遍历字符串,计算空白(单词)的出现次数并跟踪找到的最长单词。
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;
}

关于c - 分割字符串函数的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359723/

相关文章:

c - 程序崩溃,无法解释原因?

检查字符串是否是回文

c - 简单的C程序错误

c - 意外的 scanf 行为

php - 如何从mysql数据库中获取保存为数组的数据

c - 我们可以在 C 中使用什么输入运算符在获取数组输入时忽略 'space' 并接受 'Enter'

java - 在 Java 中按引号之间的值拆分字符串

c - SetBkMode(hdc, TRANSPARENT) 不起作用

C编程与计算

c++ - 声明没有大小的数组数据成员