Подтвердить что ты не робот

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, не так ли?

4b9b3361

Ответ 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);

}