XORing "Привет, мир!" отрезает строку
#include <stdio.h>
#include <string.h>
int main()
{
char greeting[]="\nHello World!\n";
int a;
for(int i=0; i<strlen(greeting); i++)
greeting[i]^=111;
for(int i=0; i<strlen(greeting); i++)
greeting[i]^=111;
printf("%s\n",greeting);
scanf("%d",&a);
}
Вывод:
Hell
Почему он вырезает все после определения буквы, соответствующей номеру ключа XOR (в данном случае ASCII 'w')? В математической логике N^N=0
и 0^N=N
, не так ли?
Ответы
Ответ 1
Поскольку 'o'
- код ASCII 111, а XORing 111 с 111 дает 0, NUL
и завершает вашу строку. Как только это произойдет (даже в первом цикле, поскольку вы каждый раз его оцениваете по циклу), strlen
сообщает, что строка намного короче, и циклы останавливаются.
Сохранение длины строки перед прохождением XORs избавит вас от этого.
Ответ 2
Это связано с тем, что когда вы xor число с самим собой, оно становится равным нулю, и когда strlen видит нуль, он думает, что это конец строки.
Если вы сохраняете длину в переменной перед первым циклом и затем используете эту сохраненную длину во втором цикле вместо strlen, ваша программа будет давать ожидаемый результат.
Ответ 3
greeting[5]
- это 'o', которое равно 111 в ASCII.
Следовательно, приветствие [5] ^ 111 будет нулевым (что закончит вашу строку)
Строка во втором цикле вернет другое значение.
Чтобы исправить это, используйте переменную len для хранения исходной строки.
Вы вернете свою строку!!!
Modified:
#include <stdio.h>
#include <string.h>
int main()
{
char greeting[]="\nHello World!\n";
int a;
int len = strlen(greeting);
for(int i=0; i<len; i++)
greeting[i]^=111;
for(int i=0; i<len; i++)
greeting[i]^=111;
printf("%s\n",greeting);
scanf("%d",&a);
}