Выявление проблемы с моим кодом ввода / вывода файла, ошибка сегмента с нулевым указателем - PullRequest
1 голос
/ 01 марта 2020

Довольно плохо знаком с c в общей схеме вещей, ища несколько советов о том, что именно вызывает ошибку сегмента в моем коде. Я считаю, что это связано с inputf2 = fopen (argv [2], "r"); поскольку это - строка, которую сказал GDB, имел проблему. Однако у меня есть почти идентичная строка ранее в моем коде, которая не вызывала ошибку сегмента для inputf1. Глядя на себя, я также считаю, что это из-за нулевого указателя, но я не совсем уверен, как мне открыть второй файл, если не нравится, как у меня. Я думаю, я просто запутался в файловом вводе / выводе в C. Основной смысл моего кода - прочитать два текстовых файла, один ключ и одно текстовое тело, а затем зашифровать текстовое тело с помощью ключа в шифре Vingenere. Использование файлов ввода / вывода в c является новым для меня, как обычно я делал это в java, поэтому я не совсем уверен, почему я получаю эту ошибку. Спасибо за чтение! Любой совет, будь то мой вопрос или просто исправление синтаксиса / другие мелкие ошибки в моем коде, будет принята с благодарностью, так как я все еще новичок и пытаюсь усовершенствовать свой подход к кодированию. Еще раз спасибо:)

Ошибка GDB:

Программа получила сигнал SIGSEGV, Ошибка сегментации. _IO_fgets (buf = 0x7ffff7ffd9f0 <_rtld_global + 2448> "", n = 8, fp = 0x0) в iofgets. c: 47 47 iofgets. c: Нет такого файла или каталога.

PS Извините если я не предоставил достаточно информации о программе или о segfault, пожалуйста, спросите меня, нужна ли какая-либо дополнительная информация! Кроме того, я прошу прощения, если это не место для новых ie вопросов, просто есть несколько других вариантов.

char* encrypt(char tempkeyray[512], char temptexray[512]) {
    int i, j;
    char encarr[512];

    for(i=0; i<512; i++) {
        encarr[i] = ('a' + (tempkeyray[i] + temptexray[i])%96 - 1);
    }

    for(j=0;j<512;j++) {
        printf("%c", encarr[j]);
    }

    return 0;
}

int main(int argc, char **argv) {
    char textray[512] = {0}, keyray[512] = {0};
    char *temp, *temp2;
    int count = 0, count2 = 0, i, j;

    FILE *inputf1, *inputf2;
    inputf1 = fopen(argv[1], "r");


    while((fgets(temp, sizeof(temp), inputf1)) != NULL) {
        count++;
        if(isalpha(*temp)) {
            if(*temp >= 'A') { //can make more specific
                keyray[i] = tolower(*temp);
            }
            else {
                keyray[i] = *temp;
            }
        }
    }
    for(i=count+1; i<512; i++) {
        keyray[i] = keyray[i-(count+1)];
    }

    fclose(inputf1);

    inputf2 = fopen(argv[2], "r");

    while((fgets(temp2, sizeof(temp2), inputf2)) != NULL) {
        count2++;
        if(isalpha(*temp2)) {
            if(*temp2 >= 'A') { //can make more specific
                textray[i] = tolower(*temp2);
            }
            else {
                textray[i] = *temp2;
            }
        }
    }
    for(j=count2; j<512; j++) {
        textray[i] = 'x';
    }

    fclose(inputf2);

    encrypt(keyray, textray);


}```
...