0

我正在尝试将字符串转换为向量。我的代码是:

char **my_str2vect(char *str)
{
    char** vect;
    char* temp;
    int num_whitespaces = 0;

    temp = str;

    for(; *temp!= '\0'; temp++)
    {
        if(*temp == ' ')
        {
            num_whitespaces++;
        }
    }

    vect = (char **)malloc((num_whitespaces+1)*sizeof(char *));

    *vect = str;

    for(; *str != '\0'; str++)
    {
        if(*str == ' ')
        {
             *str = '\0';
             *vect = ++str;
             vect++;
        }
    }

    *vect = NULL;

    return vect;
}

不幸的是,我遇到了分段错误。我使用以下代码调用该函数:

n = read(0, buffer, MAX-1);
buffer[MAX] = '\0';

if(n >= 0)
{
     vect = my_str2vect(buffer);
}
4

2 回答 2

0

您的代码中有几个错误: 1. 在您的my_str2vect函数中,指针vect被移动到您分配的内存的末尾,所以当您返回 vect 并想使用某些东西vect[1]vect[2]在调用者函数中时,一定有段错误。vect_tmp在开始操作之前,您可以使用 a来存储原始位置vect。2. 开始转换字符串时出现一些逻辑错误。请参考我下面的修改代码。

char **my_str2vect(char *str)
{
    char** vect;
    char** vect_tmp;
    char* temp;
    int num_whitespaces = 0;

    temp = str;

    for(; *temp!= '\0'; temp++)
    {
        if(*temp == ' ')
        {
            num_whitespaces++;
        }
    }

    vect_tmp = (char **)malloc((num_whitespaces+1)*sizeof(char *));
    vect = vect_tmp;

    *vect = str;

    for(; *str != '\0'; str++)
    {
        if(*str == ' ')
        {
             *str = '\0';
             *(++vect) = str + 1;
        }
    }

    *(++vect) = NULL;

    return vect_tmp;
}

请注意,即使经过修改,该功能仍然无法处理一些连续空格的特殊情况。您可能会花更多的时间来提高兼容性。

于 2013-03-01T05:13:35.620 回答
0

您仅分配向量,而不是向量的每种情况。你可以使用calloc它。

于 2013-03-01T01:54:58.653 回答