1

編集:コードを完全に修正しました。ここにあります:

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

int main(){
    int n, i , j;
    char **mensagem;
    char leitura[1000];
    FILE *arquivo;

    arquivo = fopen("entrada.txt", "r");

    fgets(leitura, 1000, arquivo);

    fclose(arquivo);

    arquivo = fopen("entrada.txt", "r");

    n = sqrt(strlen(leitura));

    mensagem = malloc(n * sizeof(char *));

    for (i = 0; i < n; i++){
        mensagem[i] = malloc(n * sizeof(char));
    }

    for (j = 0; j < n; j++){
        for (i = 0; i < n; i++){
            fscanf(arquivo, "%c", &mensagem[i][j]);
        }
    }

    for (j = 0; j < n; j++){
        for (i = 0; i < n; i++){
            if(mensagem[j][i] == '*'){
                printf(" ");
                i = n - 1;
            }
            else {
                printf("%c", mensagem[j][i]);
            }
        }
    }

    fclose(arquivo);
    free(mensagem);

    return 0;
}

アイデアは、シーザーが昔に行ったようにメッセージを解読することです:D. .txtファイルからコード化されたメッセージを読み取りました。行全体を読んでから、配列の配列を動的に割り当てます。そうすれば、列を印刷でき、メッセージは正常に印刷されます。

これが私のコードです:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(){
    int n, i , j;
    char **mensagem;
    char leitura[1000];
    FILE *arquivo;
    arquivo = fopen("entrada.txt", "r");

    fgets(leitura, 1000, arquivo);

    n = sqrt(strlen(leitura));

    mensagem = (char **)malloc(n * n * sizeof(char));

    for (j = 0; j < n; j++){
        for (i = 0; i < n; i++){
            fscanf(arquivo, "%c", &mensagem[i][j]);
        }
    }

    for (j = 0; j < n; j++){
        for (i = 0; i < n; i++){
            if(mensagem[i][j] == '*'){
                printf(" ");
                i = n - 1;
            }
            else {
                printf("%c", mensagem[i][j]);
            }
        }
    }

    fclose(arquivo);
    free(mensagem);

    return 0;
}

ファイル内のデータは次のとおりです。

AEEUMOLSHMSCGT*AGU2A***L:****T*****A

そして、期待される出力は次のとおりです。

ALG2: ESTA EH UMA MSG OCULTA

そして、その背後にあるロジックは次のとおりです。

A E E U M O
L S H M S C
G T * A G U
2 A * * * L
: * * * * T
* * * * * A

問題が正確に の呼び出しにあることはわかっていますがprintf、修正方法がわかりません。

4

1 に答える 1

3

これは「2つの星は2次元配列ではない」という典型的な例です。

mensagem =(char **)malloc(n * n * sizeof(char));

for (j = 0; j < n; j++){
    for (i = 0; i < n; i++){
        fscanf(arquivo, "%c", &mensagem[i][j]);
    }
}

mensagemn * nバイトのブロックへのポインタです。ただし、これを行うmensagem[i][j]と、コンパイラはポインタの値を読み取り、を追加iしてから、そのアドレスのポインタを読み取ります。そのポインタは何に設定されていますか?i * sizeof(char *)割り当てられたメモリにたまたま入っているものは何でも-おそらくゼロ。

最初にポインタを割り当て、次にバイトnの文字列ごとにストレージを割り当てるという2段階の割り当てを行う必要があります。n

編集:あなたが自分でそれを書くことからはるかに多くを学ぶので、私はあなたの問題を解決するために意図的にコードを書いていません...

于 2013-01-16T22:01:39.397 に答える