2015-03-04 4 views
0

Я тестирую расшифровку строк с помощью ключа в стандартном C. Я ввожу строку, вводя свои замены и строя шифр на основе истории моих замещений. Например, если я заменил c на h в строке, я сохраню его в строчном шифре как "ch ", где «обозначает начало и конец строки».Отображение неправильного символа в C

Моя проблема в том, что я пытаюсь запустить обратно через мою строку и вернуть символы обратно к своим оригиналам, мои персонажи запутались и показ как значки сердца. Любое понимание этого было бы очень оценено, я уверен, что я ошибаюсь где-то очень просто.

char from[] = ""; 
char to[] = ""; 
for (int i = 0; i <= strlen(cipher); i++){ 
    if (i == 0){ 
     from[strlen(from)] = cipher[i]; 
    } 
    else if(cipher[i-1] == ' '){ 
     from[strlen(from)] = cipher[i]; 
    } 
    else{ 
     to[strlen(to)] = cipher[i]; 
    } 
} 
for (int i = 0; i <= strlen(str); i++){ 
    for(int j = 0; j <= strlen(to); j++){ 
     if(str[i] == to[j]){ 
      str[i] = from[j]; 
     } 
    } 
} 

printf("\nUNSCRAMBLED STRING IS: %s" ,str); 

cipher - это массив символов, содержащий мой ключ шифрования. [] Удерживает второе значение в шифрованном ключе. Из [] содержит мою первую. Str - это массив символов строки, которая должна быть расшифрована.

+0

среди многих других проблем, помните, что индекс в шифров [] увеличивается 3 байта на запись, а не 1 байт. Также 'from [] и' to [] составляют только 1 байт, а этот байт содержит '\ 0', поэтому доступ к этим массивам, прошедшим индекс 0, является неопределенным поведением и может/приведет к событию сбоя seg – user3629249

ответ

3

У вас есть ряд проблем.

(1) Одна большая проблема заключается в том, что вам не хватает памяти выделено для from и to - изменения:

char from[] = ""; // this is equivalent to char from[1] = ""; 
char to[] = ""; 

напрмер:

char from[256] = ""; 
char to[256] = ""; 

(где 256 является лишь некоторые произвольный размер, который должен быть больше размера вашего набора данных).

(2) Правильно, если вы добавили символ, например, вы должны закончить свои строки.

if (i == 0){ 
    from[strlen(from)] = cipher[i]; 
} 

должно быть:

if (i == 0){ 
    int len = strlen(from); 
    from[len] = cipher[i]; 
    from[len + 1] = '\0'; 
} 

(3) Вы индексировать одним слишком много символов, когда вы перебирать строки, так, например,

for (int i = 0; i <= strlen(cipher); i++){ 

должно быть:

for (int i = 0; i < strlen(cipher); i++){ 
+0

, изменив это, используя скремблированная строка «rdease» и ключ шифрования «pr ld» выведенный расшифрованный ключ является просто «p». Я уверен, что есть проблема с моей петлей, но я не могу понять, что это за жизнь меня – Defa1t

+0

Добавлена ​​еще пара проблем и исправлений. –

+0

спасибо большое! теперь это только испортится, если я использую более одной замены. если моя переменная шифрования содержит только 2 символа, она расшифровывается отлично. Но если у меня есть две разные замены, это испортится. Данные испытаний: str = "fyease". cipher = "pf ly". str после дешифрования = «p» – Defa1t