来自String的向量导致分段错误

时间:2013-03-01 01:52:26

标签: c

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

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);
}

2 个答案:

答案 0 :(得分:0)

您只分配矢量,但不分配矢量的每种情况。您可以使用calloc

答案 1 :(得分:0)

您的代码中有几个错误: 1.在my_str2vect函数中,指针vect移动到已分配内存的末尾,因此当您返回vect并希望使用vect[1]vect[2]时在调用函数中,必须存在段错误。在vect_tmp开始操作之前,您可以使用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;
}

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