2016-08-12 9 views
1

Я хочу сделать простую программу, которая выполняет следующие действия,Почему XORing строка в c дает мне значения мусора?

  1. Возьмите входную строку из пользователя, полукокс IP [50].
  2. XOR каждый символ строки с символом '0'.
  3. Отобразить созданный таким образом Шифрованный текст, char op [50].

  4. И используя эту строку (op), снова расшифруйте строку и дайте результат такой же, как и входная строка. char rv [50].

  5. Показать расшифрованный текст.

Итак, для этого я написал код, приведенный ниже,

#include<stdio.h> 
#include<string.h> 
void main(){ 
    int i=0,len; 
    char ip[50],op[50],rv[50],b='0'; 
    printf("Enter the original text: "); 
    fgets(ip,50,stdin); 
    len=strlen(ip); 
    //ip is input text 
    //op is output cypher text 
    //rv is again the input text obtained by XORing '0' 
    while(i<len-1){ 
     op[i]=(ip[i++]^b); //XORing the input character with '0' and storing it in output string ^__^ 
    } 
    op[i]='\0'; 
    printf("\nThe Cypher Text is: "); 
    i=0; 
    puts(op); 
    while(i<len-1){ 
     printf("%c",op[i++]); 
    } 
    i=0; 

    while(i<len-1){ 
     rv[i]=(op[i++]^b);//XORing the output text again in hope of getting the input text back -__- 
    } 
    rv[i]='\0'; 
    printf("\nThe Original text again is: "); 
    puts(rv); 
    i=0; 
    printf("\n"); 
    while(i<len-1){ 
     printf("%c",rv[i++]); 
    } 
} 

, но выход всегда

Выход

C:\Users\cypher>gcc cypher.c 

C:\Users\cypher>a 
Enter the original text: qwerty 

The Cypher Text is: ▄AGUBD 
▄AGUBD 
The Original text again is: Ω∞qwer 

Ω∞qwer 

Примечание: с помощью путы() просто для проверки ошибок. Любая помощь будет оценена, спасибо.

+0

почему '

+0

мой массив начинается с 0 до длины строки – Paul

+0

.............. так? –

ответ

2

отчетность

op[i]=(ip[i++]^b); 

и

rv[i]=(op[i++]^b); 

вызывает неопределенное поведение, так как побочный эффект на i в op[i++] является unsequenced относительно вычисления значения из i в rv[i].

Изменения их

op[i]=(ip[i]^b); 
i++; 

и

rv[i]=(op[i]^b); 
i++; 
2

отчетность как этот

op[i]=(ip[i++]^b); //XORing the input character with '0' and storing it in output string ^__^ 

имеет неопределенное поведение, потому что нет никакого смысла последовательности между выражениями i и i++ в левом и правые части задания.

Кроме того, было бы лучше, чтобы удалить добавленный символ новой строки для ввода строки, как, например

ip[strcspn(ip, "\n")] = '\0'; 

Таким образом, условие цикла в этом случае должна выглядеть

while (i < len){ 
     ^^^^^^^ 

Здесь является демонстративной программой

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

#define N 50 

int main(void) 
{ 
    char ip[N]; 
    char op[N]; 
    char rv[N]; 
    char c = '0'; 
    size_t i, len; 

    printf("Enter the original text: "); 
    fgets(ip, sizeof(ip), stdin); 

    ip[strcspn(ip, "\n")] = '\0'; 

    len = strlen(ip); 

    i = 0; 
    for (; i < len; i++) op[i] = ip[i]; 
    op[i] = '\0'; 

    i = 0; 
    for (; i < len; i++) rv[i] = op[i]; 
    rv[i] = '\0'; 

    puts(ip); 
    puts(rv); 

    return 0; 
} 

Выход программы может выглядеть l ike

Enter the original text: querty 
querty 
querty 
+0

Вам просто нужно ~ 100 реп чувак! – haccks

+0

@hacks Что-то не так? –

+1

lol ...... Я говорил о вашей репутации 100 тыс. – haccks

0

Эта программа реализует кодер, который является собственным декодером. Но демонстрируя, что это не убедительно, если вы используете отдельный код для кодирования и декодирования - вы должны определить кодировщик/декодер как функцию, которую вы вызываете дважды, чтобы продемонстрировать, что она действительно является ее инверсной.

Специфические проблемы с вашим кодом: вы используете fgets(), который оставляет замыкающий символ новой строки (\n) в месте, которое портит как кодировку и форматирование - я предлагаю вам удалить символ новой строки (т.е. заменить его '\0'), чтобы сделать все проще; другие упомянули проблемы с использованием i и i++ в том же операторе, вы могли бы избежать этого, используя цикл for вместо цикла while.

Вот потенциал переделки с использованием идей, упомянутых выше:

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

#define BUFFER_SIZE (50) 

void encode_decode(char key, const char *input, char *output) { 
    size_t i = 0, input_length = strlen(input); 

    // XOR the input character with key and store it in output string ^__^ 
    for (i = 0; i < input_length; i++) { 
     output[i] = input[i]^key; 
    } 

    output[i] = '\0'; 
} 

int main() { 
    char key = '0', input[BUFFER_SIZE], output[BUFFER_SIZE], reverse[BUFFER_SIZE]; 

    printf("Enter the original text: "); 

    (void) fgets(input, BUFFER_SIZE, stdin); 

    *strrchr(input, '\n') = '\0'; 

    encode_decode(key, input, output); 

    printf("The Cypher Text is: %s\n", output); 

    // reverse is the input text obtained by again XORing with key 
    encode_decode(key, output, reverse); 

    printf("The Original text again is: %s\n", reverse); 

    return 0; 
} 

Пример

> ./a.out 
Enter the original text: elephant 
The Cypher Text is: U\[email protected]^D 
The Original text again is: elephant 
> 

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

  • Нет связанных вопросов^_^