0

配列にメモリを動的に割り当てるのに問題があります。プログラムは単純に、最初の行を 2 番目の行と、3 番目の行を 4 番目の行と交換することになっています。次のような奇妙な結果が得られます。

文字列を入力してください: こんにちは

文字列を入力してください: お元気ですか

文字列を入力してください: 私は元気です

文字列を入力してください: さようなら

文字列を入力してください: バイ

文字列を入力してください: xx

=========================

元気ですか

元気です ありがとう

こんにちは

!元気ですか

さよなら

ばい

元気です ありがとう

!さよなら

バイ

!xx

    int count = 0;
    char *lines[MAX_LINES];
    char *tmp[50]; 


    printf("Enter string: ");
    fgets(tmp, 50, stdin);
    lines[count] = (char *) malloc((strlen(tmp)+1) * sizeof(char));
    strcpy(lines[count], tmp); 

    while(strcmp("xx\n", lines[count])){
            count++;
            printf("Enter string: ");
            fgets(tmp, 50, stdin); 
            lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char));

            strcpy(lines[count], tmp); 
    }

void exchange(char * records[])
{
    char * temp;
    temp = records[0];
    records[0] = records[1];
    records[1] = temp;

    temp = records[2];
    records[2] = records[3];
    records[3] = temp; 

}

void printArray(char * inputs[], int row, int col)
{
    int i, j;

    for(i = 0; i < row; i++){
        for(j = 0; j < col; j++){
            printf("%c", inputs[i][j]);
        }

    }
}   
4

1 に答える 1

0

これは良くない:

char *tmp[50]; 

これを行うつもりでした:

char tmp[50]; 

奇妙なことに、それはちょっとうまくいきますが、コンパイラはどこでも警告を発していたはずです。

あなたの主な問題はprintArray、文字列内の NULL ターミネータをチェックしない関数だと思います。そのため、それらのほとんどの終わりからすぐに実行されます。

文字ごとに印刷する代わりに、次のようにします。

void printArray(char * inputs[], int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%s", inputs[i]);
    }
}  

の使い方のコツmallocです。結果をキャストしないでください。また、char値用にスペースを確保している場合は使用しないでくださいsizeof(char)。常に 1 です。

lines[count] = malloc( strlen(tmp) + 1 );
于 2013-07-03T23:26:30.560 に答える