2

配列にメモリを動的に割り当てるのに問題があります。私は何時間もデバッグしてきましたが、ポインタはありますか?

残りのコードを投稿しました。最初の行を 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

このコードはうまくいくようです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum { MAX_LINES = 50 };
static void printArray(char *inputs[], int rows);
static int readLine(char *buffer, size_t buflen);

int main(void)
{
    int count = 0;
    char *lines[MAX_LINES];
    char  tmp[50]; 

    for (count = 0; count < MAX_LINES; count++)
    {
        if (readLine(tmp, sizeof(tmp)) == EOF)
            break;
        lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char));
        if (lines[count] == 0)
            break;
        strcpy(lines[count], tmp); 
    }

    putchar('\n');
    printArray(lines, count);

    return(0);
}

static int read_line(char *buffer, size_t buflen)
{
    printf("Enter string: ");
    if (fgets(buffer, buflen, stdin) == 0 || strcmp("xx\n", buffer) == 0)
        return EOF;
    return 0;
}

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

サンプル実行 1 (EOF を使用):

$ ./rl
Enter string: Abyssinia
Enter string: Wimbledon Common
Enter string: ^D
0: Abyssinia
1: Wimbledon Common
$

サンプル実行 2 (「xx」を使用):

$ ./rl
Enter string: Abyssinia
Enter string: Wimbledon Common
Enter string: Strawberry Lemonade
Enter string: xx

0: Abyssinia
1: Wimbledon Common
2: Strawberry Lemonade
$

何が違うの?tmpコメントに記載されているように、タイプを修正しました。繰り返しを避けるためにreadLine()、プロンプトを管理し、プロセスを読み取って比較する機能を作成しました。"xx\n"私は使用を避けましたが、返されたポインターを使用する前に成功するstrdup()ことを確認します。malloc()読み込まれる行が多すぎないようにします (forループ)。文字列のprintArray()長さが可変であるため、コードは行数のみを取得します。exchange()機能が使用されておらず、使用方法がわからなかったため削除しました。コードは完全でコンパイル可能です (したがって、これは SSCCE — Short, Self-Contained, Correct Exampleです)。

于 2013-07-03T23:25:53.683 に答える