2016-02-03 3 views
0

Я работаю над созданием кода шифрования для класса, который непрерывно разделяет строку пополам, пока не осталось только 1 или 2 символов, в которых вы меняете местами с разделенными символами справа , Однако, когда я запускаю код, который я постоянно получаю эту ошибку:C Сегментация Неисправность в коде простого шифрования

INPUT A PHRASE: 1234 
LENGTH: 4 
Segmentation fault (core dumped) 

Ниже мой исходный код, если кто-то может помочь мне решить эту проблему, было бы весьма признателен.

#include <stdio.h> 
#include <string.h> 

void encrypt(char *str, int size); 

int main(){ 
    char input[8192]; 
    int length; 

    printf("INPUT A PHRASE: "); 
    fgets(input, 8192, stdin); 
    length = strlen(input) -1; 
    printf("LENGTH: %d\n", length); 

    encrypt(input, length); 
    printf("ENCRYPTION: %s\n", input); 
    return 0; 
} 

void encrypt(char str[], int size){ 

    char *final; 

    int i; 
    int k = size/2; 

    char *left = strncpy(left, str, k); 
    encrypt(left, k); 

    char *right = strncpy(right, str + k, size - k); 
    encrypt(right, size - k); 

    if(size <= 2 && size > 0){ 
     final = strcat(final, right); 
     final = strcat(final, left); 
     return; 
    } 
} 
+1

Передача неинициализированных переменных на 'strncpy()' и 'strcat()' - плохая идея. Кажется, у вас также есть другие проблемы. – MikeCAT

+0

Проблема заключается в inifinite рекурсии, потому что вы всегда называете 'encrypt (left, k);' в функции 'encrypt'. – MikeCAT

ответ

4

strncpy принимает буфер в качестве первого параметра, где, чтобы скопировать данные. В вашем случае вы передаете ему неинициализированный указатель вместо:

char *left = strncpy(left, str, k); 

Правильным было бы что-то вроде:

char left[SOME_SIZE]; 
strncpy(left, str, size); //size should not be greater than SOME_SIZE 

И то же самое с right переменной. Ссылка: strncpy

+1

'strcat()' также получает неинициализированный 'final'. – MikeCAT

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