str split功能不起作用

时间:2017-02-11 16:11:30

标签: c string

我有这个函数将一维数组转换为二维数组。当我转换它时,我需要在每个4x4平方之间保留\n(换行符)。

int     count_words(const char *str, char c)
{
    int     i;
    int     count;

    i = 0;
    count = 0;
    while (str[i])
    {
        while (str[i] && str[i] == c)
            i++;
        if (str[i])
        {
            count++;
            while (str[i] && str[i] != c)
                i++;
        }
    }
    return (count);
}

char    *get_word(const char *str, char c)
{
    char    *word;
    int     i;

    i = 0;
    word = (char*)malloc(sizeof(char) * 500);
    while (str[i] && str[i] != c)
    {
        word[i] = str[i];
        i++;
    }
    word[i] = '\0';
    return (word);
}

char    **ft_strsplit(const char *s, char c)
{
    char    **split;
    int     words;
    int     i;

    i = 0;
    words = count_words(s, c);
    split = (char**)malloc(sizeof(char*) * words + 1);
    if (split == NULL)
        return (NULL);
    while (*s)
    {
        if (*s == c)
            s++;
        if (*s)
        {

            if (*s == c)
            {
                split[i] = ft_strdup("\0");
                s++;
                //printf("=========>%s\n", split[i]);
                i++;
            }
            else{
                split[i] = get_word(s, c);
                s = s + ft_strlen(split[i]);

        //printf("%s\n", split[i]);
            i++;}
        }
    }
    split[i] = NULL;
    int  k = 0;
    while (split[k])
    {
        printf("%s\n", split[k]);
        k++;
    }
    return (split);
}

这是输入文件: enter image description here

这是在这个一维字符串(const char *s)中转换的:

#...\n#...\n#...\n#...\n\n.#..\n.#..\n.#..\n.#..\n\n###.\n..#.\n....\n....\n\n....\n....\n....\n####\n

这就是输出,其中包含随机无用的字符。

#...
#...
#...
#...

.#..
.#..
.#..
.#..
�P@��
###.
..#.
....
....

....
....
....
####

为什么会出现那些随机字符?

1 个答案:

答案 0 :(得分:0)

实际上,如果我运行你的代码(使用\n作为中断字符),它运行正常。

语言的记忆力很大(尽管没有伤害)。你可以这样做:

    i = 0;
    while (str[i] && str[i] != c) i++;

    word = malloc(i + 1);
    for (int j=0; j<i; j++) word[j]= str[j];
    word[j] = '\0';