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て元の位置を保存できます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 に答える