2015-12-24 2 views
1

Im получаяНарушения прав доступа чтение местоположения 0x00000000 в C

доступа чтение нарушения расположения 0x00000000

в то время как я пытаюсь запустить мою программу. Я могу создать программу без каких-либо ошибок, но когда я попытаюсь запустить ее, она сработает. Я читаю здесь, в StackOverflow, что эта проблема возникает, когда есть указатели, указывающие ни на что. Я искал код без каких-либо успехов. Кто-нибудь здесь, кто может знать, где проблема?

main.c

#include <stdio.h> 
#include <stdlib.h> 
#include "functions.h" 
#define FILENAME 256 


/* 
* 
*/ 



int main(int argc, char** argv) { 


char * data = readFromFile("input.txt"); 
int arrLength = getArrayLength(data); 
char * encryptedData = (char *)malloc(arrLength * sizeof(char) + 1 * sizeof(char)); 
decrypt(data, arrLength, 1, encryptedData); 
encrypt(data, arrLength, 1, encryptedData); 
int menu = 0; 
int key; 

printf("Enter 1 for decrypt or 2 for encrypt from input.txt"); 

scanf("%d", &menu); 
if (menu == 1) { 
    printf("Enter key:"); 
    scanf("%d", &key); 
    encrypt(data, arrLength, key, encryptedData); 

} 
else { 
    printf("Enter key:"); 
    scanf("%d", &key); 
    decrypt(data, arrLength, key, encryptedData); 
} 

writeToFile("output.txt", encryptedData); 

printf("\n Enter any key to exit 11: "); 
getchar(); 
return (1); 
} 

functions.c

#include <stdio.h> 
#include <stdlib.h> 
#include "functions.h" 
char * readFromFile(char * fileName) { 
FILE *fp; 
char c; 
if ((fp = fopen(fileName, "r")) == NULL) { 
    puts("Error: input file invalid"); 
    return NULL; 
} 

int count = 0; 
while ((c = fgetc(fp) != EOF)) count++; 
rewind(fp); 
char *data = (char *)malloc(count * sizeof(char) + 1 * sizeof(char)); 
count = 0; 
while (!feof(fp)) { 
    fscanf(fp, "%c", &data[count++]); 
} 

fclose(fp); 
return data; 
    } 

    void writeToFile(char * fileName, char *data) { 
FILE *fp; 
if ((fp = fopen(fileName, "w")) == NULL) { 
    puts("Error: output file invalid"); 
} 
else { 
    int i = 0; 
    while (data[i] != '\0') { 
     fputc(data[i], fp); 
     i++; 
    } 
    fclose(fp); 
} 
    } 

    int encrypt(char *plainText, int arrLength, int key, char *cipherText) { 
if (key > 25 || key < 1) { 
    puts("Error: invalid key"); 
    return 0; 
} 
for (int i = 0; i < arrLength; i++) { 
    if ((plainText[i] >= 97 || plainText[i] <= 122) || (plainText[i] >= 65 || plainText[i] <= 90)) { 
     // only encrypt alpha characters 
     cipherText[i] = plainText[i] + key; 
    } 
    else { 
     cipherText[i] = plainText[i]; 
    } 
} 
return 1; 
    } 
    int decrypt(char *plainText, int arrLength, int key, char *cipherText) { 
if (key > 25 || key < 1) { 
    puts("Error: invalid key"); 
    return 0; 
} 
for (int i = 0; i < arrLength; i++) { 
    if ((plainText[i] >= 97 || plainText[i] <= 122) || (plainText[i] >= 65 || plainText[i] <= 90)) { 
     // only decrypt alpha characters 
     cipherText[i] = plainText[i] - key; 
    } 
    else { 
     cipherText[i] = plainText[i]; 
    } 
} 
return 1; 
    } 
    int getArrayLength(char *data) { 
int i = 0; 
while (data[i] != '\0') { 
    i++; 
} 
return i; 
} 

functions.h

#ifndef MY_FUNCTION 
#define MY_FUNCTION 

char * readFromFile(char * fileName); 
void writeToFile(char * fileName, char *data); 
int encrypt(char *plainText, int arrLength, int key, char *cipherText); 
int decrypt(char *plainText, int arrLength, int key, char *cipherText); 
int getArrayLength(char *data); 

#endif 
+1

Ваша программа довольно длинная. Не могли бы вы попытаться сузить его? – fuz

+1

Добро пожаловать в переполнение стека! [Пожалуйста, ознакомьтесь с этим обсуждением, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+3

Добро пожаловать в переполнение стека! Пожалуйста, см. [Почему? »(! Feof (file))« всегда неправильно? »(Http://stackoverflow.com/q/5431941/2173917) –

ответ

1

Фактическая ошибка означает NULL Указатель разыгрывается, вероятно, потому, что вы никогда не проверяете возвращаемое значение malloc(), еще одна вещь, которую вы должны проверить, - это возвращаемое значение scanf().

Кроме того, вы никогда не должны nul прекратить чтение данных из файла, а также данные, которые вы encrypt()/decrypt(). И все-таки относиться к нему как при попытке кода, как

while (data[i] != '\0') 
    i++; 

Я предполагаю, что вы не можете использовать strlen(), потому что это именно то, что делает strlen().

Кроме того, вам не нужно перебирать каждый байт в файле, чтобы вычислить его длину. Попробуйте это вместо этого

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

#define FILENAME 256 

char * 
readFromFile(char * fileName) 
{ 
    FILE *fp; 
    size_t length; 
    char *data; 

    if ((fp = fopen(fileName, "r")) == NULL) 
    { 
     puts("Error: input file invalid"); 
     return NULL; 
    } 

    fseek(fp, 0L, SEEK_END); 
    length = ftell(fp); 
    rewind(fp); 

    data = malloc(length + 1); 
    if (data == NULL) 
    { 
     puts("Error: allocating memory"); 
     fclose(fp); 
     return NULL; 
    } 

    if (fread(data, 1, length, fp) < length) 
    { 
     puts("Error: reading from the file"); 

     free(data); 
     fclose(fp); 
     return NULL; 
    } 
    // `nul' terminate please 
    data[length] = '\0'; 
    puts(data); 
    fclose(fp); 

    return data; 
} 

void 
writeToFile(char * fileName, char *data) 
{ 
    FILE *fp; 
    if ((fp = fopen(fileName, "w")) == NULL) 
     puts("Error: output file invalid"); 
    else 
    { 
     for (int i = 0 ; data[i] != '\0' ; ++i) 
      fputc(data[i], fp); 
     fclose(fp); 
    } 
} 

int 
encrypt(char *plainText, size_t arrLength, int key, char *cipherText) 
{ 
    if (key < 25 && key >= 1) 
    { 
     for (size_t i = 0 ; i < arrLength ; i++) 
     { 
      if ((plainText[i] >= 97 || plainText[i] <= 122) || (plainText[i] >= 65 || plainText[i] <= 90)) 
      { 
       // only encrypt alpha characters 
       cipherText[i] = plainText[i] + key; 
      } 
      else 
      { 
       cipherText[i] = plainText[i]; 
      } 
     } 
     // `nul' terminate please 
     cipherText[arrLength] = '\0'; 
     return 1; 
    } 
    puts("Error: invalid key"); 
    return 0; 
} 
int 
decrypt(char *plainText, size_t arrLength, int key, char *cipherText) 
{ 
    if (key < 25 && key >= 1) 
    { 
     for (size_t i = 0; i < arrLength ; i++) 
     { 
      if ((plainText[i] >= 97 || plainText[i] <= 122) || (plainText[i] >= 65 || plainText[i] <= 90)) 
      { 
       // only decrypt alpha characters 
       cipherText[i] = plainText[i] - key; 
      } 
      else 
      { 
       cipherText[i] = plainText[i]; 
      } 
     } 
     // `nul' terminate please 
     cipherText[arrLength] = '\0'; 
     return 1; 
    } 
    puts("Error: invalid key"); 
    return 0; 
} 

int 
getArrayLength(char *data) 
{ 
    size_t length; 
    for (length = 0 ; data[length] != '\0' ; ++length); 
    return length; 
} 

int 
main(int argc, char** argv) 
{ 
    char * data; 
    int arrLength; 
    char *encryptedData; 
    int menu = 0; 
    int key; 

    data = readFromFile("input.txt"); 
    if (data == NULL) 
     return -1; 
    arrLength = getArrayLength(data); 
    encryptedData = malloc(arrLength + 1); 
    if (encryptedData == NULL) 
     return -1; 
    decrypt(data, arrLength, 1, encryptedData); 
    encrypt(data, arrLength, 1, encryptedData); 

    printf("Enter 1 for decrypt or 2 for encrypt from input.txt "); 

    if (scanf("%d", &menu) != 1) 
     return -1; 
    if (menu == 1) 
    { 
     printf("Enter key: "); 
     if (scanf("%d", &key) != 1) 
      return -1; 
     encrypt(data, arrLength, key, encryptedData); 
    } 
    else 
    { 
     printf("Enter key: "); 
     if (scanf("%d", &key) != 1!) 
      return -1; 
     decrypt(data, arrLength, key, encryptedData); 
    } 
    writeToFile("output.txt", encryptedData); 

    printf("\n Enter any key to exit 11: "); 

    free(data); 
    free(encryptedData); 
    return (1); 
} 

Обратите внимание, что я не смешиваю объявления с утверждениями, потому что это делает код более трудным для чтения и понимания.

+0

http://stackoverflow.com/a/9138149/971127 – BLUEPIXY

Смежные вопросы