1

次の関数を使用して、ベクトルを文字列に変換しようとしています。

char* my_vect2str(char** input)
{
    int i;
    char* ret = (char*)xmalloc(sizeof(char*));
    for(i=0; input[i] != NULL; i++)
    {
        if(*input[i] == '\0')
            ret[i] = ' ';
        else
            ret[i] = *input[i];
    }
    ret[i] = '\0';
    return ret;
}

これは、ベクトル内の各文字列の最初の文字だけを取得しているようです。for ループを変更してこれを適切に機能させるにはどうすればよいですか? ありがとう!

4

2 に答える 2

0

最初のループは、入力の文字列の合計サイズを計算します。次に、スペースが割り当てられ、文字列が ret に連結されます。

char* my_vect2str(char** input)
{
    int i, j, k = 0;
    char* ret;
    int size = 0;
    int len;
    char* inp = input[k++];

    while (inp != NULL) {
        size += strlen(inp);
        inp = input[k++];
    }

    ret = malloc((size * sizeof(char)) + 1);
    memset(ret, 0, size + 1);

    i = 0;
    j = 0;
    while (i < size) {
        if (input[j] != NULL) {
            len = strlen(input[j]);
            memcpy(&ret[i], input[j], len);
            i += len;
        }
        ++j;
    }

    return ret;
}
于 2013-02-24T23:25:06.960 に答える
0

malloc は、ポインター自体ではなく、ポインターの内容のサイズである必要があります。また、malloc void * をキャストする必要もありません。ポインターの両方の次元を反復処理するには、内部ループ カウンターが必要です。これはうまくいくはずです:

char* my_vect2str(char** input)
{
    int i;
    int count = 0;
    char* ret = (char*)malloc(sizeof(char*)); // should be a larger size
    for(i=0; input[i] != NULL; i++)
    {
        int j = 0;
        while(1){
            if(input[i][j] == '\0'){
                ret[count++] = ' ';
                break;
            }else{
                ret[count++] = input[i][j];
            }
            j++;
        }
    }
    ret[count] = '\0';
    return ret;
}
于 2013-02-24T23:18:34.690 に答える