尝试从文件打印数据时出现分段错误

时间:2013-01-16 21:47:22

标签: c segmentation-fault

编辑:我现在完全修复了我的代码。这是:

#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的调用有关,但我不确定如何修复它。

1 个答案:

答案 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字节字符串分配存储空间。

编辑:我故意没有编写代码来解决你的问题,因为你自己编写代码会有更多的东西......