簡體   English   中英

來自字符串的向量導致分段錯誤

[英]Vector from String causes Segmentation Fault

我正在嘗試將字符串轉換為向量。 我的代碼是:

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

您僅分配矢量,而不分配矢量的每種情況。 您可以為此使用calloc

您的代碼中有幾個錯誤:1.在my_str2vect函數中,指針vect被移動到分配的內存的末尾,因此當您返回vect並想在其中使用vect[1]vect[2]時調用程序功能時,必須存在段故障。 在開始對vect進行操作之前,可以使用vect_tmp存儲原始位置。 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;
}

請注意,即使修改后,此功能仍無法處理某些連續空格的特殊情況。 您可能需要花費更多時間來改善兼容性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM