在阅读此问题之前,请注意我的问题与学校作业有关。对于此赋值,我们允许使用的唯一函数是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;
}
答案 0 :(得分:2)
您忘记重置k
。 while
中的外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循环中,我再次使用
进行mallocword = (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++;
}
}