拆分字符串并存储到字符串数组中

时间:2013-11-24 13:23:36

标签: c strtok

作为旨在存储字典并根据它替换单词的程序的一部分,我编写了一个函数,它基本上将字符串(使用strtok)分割为单词(用空格分隔),并且将每个单词存储到一个字符串数组中。 代码如下:

void StoreArr(char * original,char ** dest)
            {
                int i=0;

                char * token =strtok(original, " ");
                dest[i]=malloc(sizeof(token));
                strcpy(dest[i],token);
                ++i;

                while(token!=NULL)
                {
                        dest[i]=malloc(sizeof(token));
                        strcpy(dest[i],token);
                        printf("%s",token);
                        token =strtok(NULL, " ");
                        ++i;
                }

            }

我通过了以下变量:

         char * File = "";
         File=malloc(Length(Text)*(sizeof(char)));
         char ** Destination[Count(' ',File)];

目的地的长度是单词的数量。 程序运行后,它会自动终止而不显示文本 它是使用StoreArr(File,Destination);

调用的

编辑:

int Length(FILE * file)
            {
                 long result;
                    long origPos = ftell(file);//original start position of file
                    fseek(file, 0, SEEK_END);//move to end of file
                    result = ftell(file);//return value at end
                    fseek(file, origPos, SEEK_SET);//rewind to beginning
                    return result;
            }
            int Count(char a,char * b)
            {
                int i=0;
                int count=0;
                while(b[i]!='\0')
                {
                if(b[i]==a || b[i]=='\n')
                    ++count;
                ++i;
                }
                return count+1;
            }

?我收到警告"传递' StoreArr'来自不兼容的指针类型[默认启用]" 提前谢谢。

P.S:Breaking down string and storing it in array

上一篇文章中的代码与我的相同,但我的工作不起作用。我怀疑这两行是否有问题,我不知道为什么:

 dest[i]=malloc(sizeof(token));
                    strcpy(dest[i],token);

1 个答案:

答案 0 :(得分:0)

如果没有看到更多代码,您可能会在代码中看到未定义的行为

声明Destination你有一个指向指针的数组,我不知道这是不是你想要的。您还需要分配所有指针。

您还必须小心,因为strtok修改了它标记的字符串,因此您无法传递文字或常量字符串。


如果是我,我会做这样的事情:

char **Destination = NULL;
StoreArr(Original, &Destination);

并且具有这样的功能

size_t StoreArr(char *original, char ***destination)
{
    if (original == NULL || destination == NULL)
        return 0;

    size_t size = 0;
    char *token = strtok(original, " ");
    while (token != NULL)
    {
        /* (re)allocate array */
        char **temp = realloc(*destination, sizeof(char *) * (size + 1));
        if (temp == NULL)
        {
            /* Allocation failed, free what we have so far */
            if (*destination != NULL)
            {
                for (size_t i = 0; i < size; ++i)
                    free((*destination)[i]);
                free(*destination);
            }

            return 0;
        }

        /* Set the destination pointer */
        *destination = temp;

        /* Duplicate the token */
        (*destination)[size++] = strdup(token);

        /* Get next token */
        token = strtok(NULL, " ");
    }

    return size;
}

该函数现在根据需要动态分配新条目,并在出错时返回数组中的条目数或0