nicita23 N nicita23 Регистрация 20 Дек 2013 Сообщения 95 Репутация 1 Спасибо 0 Монет 0 22 Апр 2016 #1 #include #include using std::string; using std::cout; string scramble(string input, char scr){ auto pos = input.begin(); auto end = input.end(); while(pos != end) *pos++ = *pos ^ scr; return input; } int main(){ char mask = 8; string inputString = "Simple Xstring"; string scrambled = scramble(inputString, mask); string clear = scramble(scrambled, mask); cout<<"Before: " <<inputString; cout<<" After: " <<scrambled; cout<<" Clear:"<<clear; cout<<" "; } Когда компилируешь, выдает: Before: Simple Xstring After: aexdm(P{|zafo Clear:mple Xstring В последней строчке Clear должно быть написано Simple Xstring, а там две первые буквы не выводит. Не могу понять в чем дело...
#include #include using std::string; using std::cout; string scramble(string input, char scr){ auto pos = input.begin(); auto end = input.end(); while(pos != end) *pos++ = *pos ^ scr; return input; } int main(){ char mask = 8; string inputString = "Simple Xstring"; string scrambled = scramble(inputString, mask); string clear = scramble(scrambled, mask); cout<<"Before: " <<inputString; cout<<" After: " <<scrambled; cout<<" Clear:"<<clear; cout<<" "; } Когда компилируешь, выдает: Before: Simple Xstring After: aexdm(P{|zafo Clear:mple Xstring В последней строчке Clear должно быть написано Simple Xstring, а там две первые буквы не выводит. Не могу понять в чем дело...
seregaopa2 S seregaopa2 Регистрация 2 Ноя 2013 Сообщения 99 Репутация 0 Спасибо 0 Монет 0 22 Апр 2016 #2 *pos++ = *pos ^ scr; нигде не гарантируется, что значение pos в правой части будет взято из pos до ++ (из левой), а не после (что и происходит). Раздели операцию на две: XOR-енье и увеличение pos. Позитивный голос 0
*pos++ = *pos ^ scr; нигде не гарантируется, что значение pos в правой части будет взято из pos до ++ (из левой), а не после (что и происходит). Раздели операцию на две: XOR-енье и увеличение pos.
jocabs J jocabs Регистрация 9 Июл 2013 Сообщения 86 Репутация 0 Спасибо 0 Монет 0 22 Апр 2016 #3 *pos++ = *pos ^ scr; попробуй так {*pos = *pos ^ scr;pos++} Позитивный голос 0