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;
}

这个想法是像 Cesar 在过去那样破译消息: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

这是一个典型的“两星不成二维数组”的例子。

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]);
    }
}

mensagem是指向字节块的指针n * n。但是,当您这样做时mensagem[i][j],编译器将读取指针的值,添加i,然后读取该地址处的指针。该指针设置为什么?无论发生在i * sizeof(char *)您分配的内存中的什么 - 可能为零。

您需要进行两阶段分配,首先分配n指针,然后为每个n字节字符串分配存储空间。

编辑:我故意没有编写代码来解决您的问题,因为您会从自己编写代码中学到更多...

于 2013-01-16T22:01:39.397 回答