#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;
}
这个想法是像塞萨尔那样的decypher消息: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
的调用有关,但我不确定如何修复它。
答案 0 :(得分: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
字节字符串分配存储空间。
编辑:我故意没有编写代码来解决你的问题,因为你自己编写代码会有更多的东西......