0

ある文字列配列に既に格納されている文字列の一部を別の空の配列にコピーしようとしました。(char配列へのポインタの配列と呼ばれると思います)

各文字列の最初の 3 文字をコピーし、それらを 2 番目の配列に格納してから出力したいと思います。

AAA
BBB
CCC
DDD
EEE
FFF

これが私のコードです。

void main()
{

/*ARRAY 1*/
char *line1 = "AAAAA";
char *line2 = "BBBBB";
char *line3 = "CCCCC";
char *line4 = "DDDDD";
char *line5 = "EEEEE";
char *line6 = "FFFFF";


char *array1[6];

array1[0] = line1;
array1[1] = line2;
array1[2] = line3;
array1[3] = line4;
array1[4] = line5;
array1[5] = line6;


int i;  

char *array_main[6];

for(i = 0; i<6 ; i++ ) {
    array_main[i] = ("%*.*s\n",1,3,array1[i]);
    printf("%s", array_main[i]);
    printf("\n");
    }
}

ここでmallocを実行する必要がありますか? (array_main [i]の場合)私が理解していることから、基本的には特定の文字のアドレスをarray_mainの要素にコピーしているだけです。

編集 - 申し訳ありませんが、これをより明確にする必要がありました.array_mainで文字列を収集し、実際にデータをコピーするループの外で順番に出力したいと思います。

4

2 に答える 2

1

静的に宣言された文字列へのポインターを配列にコピーしています。それは理論的には問題ありません。ただし、残りの文字列を切り捨てたい場合は、ターゲット文字列用のメモリを準備する必要があります。文字列に書き込むと、未定義の動作が発生するためです。

この行:

array_main[i] = ("%*.*s\n",1,3,array1[i]);

間違いなくあなたが望むことはしません。これはコンパイルするべきではないと思います。

配列と適切なサイズのバイト (3+1) をループしてからmalloc、必要な文字列の部分をコピーします (末尾の 0 バイトを忘れないでください)。

したがって、次のようになります。

for(i = 0; i < 6; i++)
{
    array_main[i] = malloc(4);
    snprintf(array_main[i], 4, "%.3s", array[i]);
    printf("%s\n", array_main[i]);
    free(array_main[i]);
}

より単純なバージョン (不必要なメモリ オーバーヘッドを伴う) は次のようになります。

for(i = 0; i < 6; i++)
{
    array_main[i] = strdup(array[i]);
    array_main[i][3] = 0;
    printf("%s\n", array_main[i]);
    free(array_main[i]);
}
于 2013-08-08T13:41:42.977 に答える
1
#include <stdio.h>
#include <string.h>

int main(void){
    const char *array1[6] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD", "EEEEE", "FFFFF" };
    char array_main[6][4] = {{0}};//4 : 3 + 1 (+1 for End of string('\0'))
    int i;

    for(i = 0; i<6 ; i++ ) {
        strncpy(array_main[i], array1[i], 3);
        printf("%s\n", array_main[i]);
    }
    return 0;
}
于 2013-08-08T13:43:32.060 に答える