用空格分割字符串

时间:2016-08-21 02:29:09

标签: c c99

在阅读此问题之前,请注意我的问题与学校作业有关。对于此赋值,我们允许使用的唯一函数是malloc()。其他所有内容都必须在不使用其他库的情况下完成。

我正在调用函数ft_split_whitespaces。此函数将字符串作为输入并将其“拆分”为单词。单词是空格,制表符和换行符。

#include <stdio.h>

char **ft_split_whitespaces(char *str);

int main(void)
{
    char *str = "what is";
    char **test = ft_split_whitespaces(str);

} 

关于上面的示例,每个索引的结果应该

test[0] = "what"
test[1] = "is"
test[2] = NULL

但是,我只能打印测试[0]的结果。所有其他索引都不会打印显示。下面是一些代码示例,我假设它应该打印我的函数的结果。

int i = 0;
while(test[i] != NULL)
{
   printf("%s", test[i]);
   i++;
}

运行此部分代码时,只将test [0]打印到输出。我一直坐在这里试图调试我的代码几个小时。如果有人有空闲时间并且不介意查看我的代码,我会非常感激。我有一种感觉,这可能是我如何使用malloc的问题,但我仍然无法弄明白。

#include <stdlib.h>
#include <stdio.h>


int     count_whitespaces(char *str)
{
    int space_count;
    int i;

    space_count = 0;
    i = 0;
    while(str[i] != '\0')
    {
        if(str[i] == ' ' || str[i] == 9 || str[i] == '\n')
        {
            if(str[i+1] != ' ' && str[i+1] != 9 && str[i+1] != '\n')
                space_count++;
        }
        i++;
    }
    return (space_count);
}

int     check_whitespace(char c)
{
    if (c == ' ' || c == 9 || c == '\n' || c == '\0')
    {
        return (1);
    }
    else
        return(0);
}

int     count_characters(char *str, int i)
{
    int char_count;

    char_count = 0;
    while(str[i])
    {
        if(str[i+1] != ' ' && str[i+1] != 9 && str[i+1] != '\n')
            char_count++;
        else
            break;
        i++;
    }
    return (char_count);
}

char    **ft_split_whitespaces(char *str)
{
    int     i;
    int     j;
    int     k;
    char    **word;
    int     space;

    i = 0;
    j = 0;
    k = 0;
    word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2));
    while(str[i] != '\0')
    {
        if (check_whitespace(str[i]) == 1)
            i++;
        else
        {           
            if((word[j] = malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL)
                return (NULL);
            while (check_whitespace(str[i]) == 0)
            {
                word[j][k] = str[i];
                i++;
                k++;
            }
            j++;
        }       
    }
    j++;
    word[j] = NULL;
    j = 0
    return word;
}

2 个答案:

答案 0 :(得分:2)

您忘记重置kwhile中的外ft_split_whitespaces循环应该看起来像

  while (str[i] != '\0') {
    if (check_whitespace(str[i]) == 1){
      i++;
    }
    else {
      if ((word[j] =
           malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL){
        return (NULL);
      }
      while (check_whitespace(str[i]) == 0) {
        word[j][k] = str[i];
        i++;
        k++;
      }
      word[j][k] = '\0';
      j++;
      k = 0;             // reset k
    }
  }

答案 1 :(得分:0)

所以当我完成输入这个问题时,我确实知道我的代码出了什么问题(感谢堆栈溢出!)。无论如何我决定发布它,因为我认为对我这样的新手进行编码可能是一次很好的学习经历。

这就是我的问题所在。

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2));
    while(str[i] != '\0')
    {
        if (check_whitespace(str[i]) == 1)
            i++;
        else
        {           
            if((word[j] = malloc(sizeof(char) * (count_characters(str, i) + 1))) == NULL)
                return (NULL);
            while (check_whitespace(str[i]) == 0)
            {
                word[j][k] = str[i];
                i++;
                k++;
            }
            j++;
        }       
    }

我使用以下代码

在mall循环之外使用我的char **字
word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2));

然后在实际的while循环中,我再次使用

进行malloc
word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2));

在同一个变量上多次使用malloc会导致各种奇怪的问题。所以在while循环中我最终使用了一个我声明为char * words的新变量。这是while循环的那部分,带有正确的代码。

word = (char**)malloc(sizeof(char*)*(count_whitespaces(str) + 2));
    while(str[i] != '\0')
    {
        if (check_whitespace(str[i]) == 1)
            i++;
        else
        {           
            words = malloc(sizeof(char) * (count_characters(str, i) + 1));
            k = 0;
            while (check_whitespace(str[i]) == 0)
            {
                words[k] = str[i];
                i++;
                k++;
            }
            words[k] = '\0';
            word[j] = words;
            j++;
        }       
    }