У меня есть быстрый вопрос об использовании XOR двух своп двух строковых литералов.
поэтому у меня есть следующее:
#include #include #include void intSwap(int *a, int *b){ *a=*a^*b; *b=*a^*b; *a=*a^*b; } void swapString(char **a, char **b){ char *temp=*a; *a=*b; *b=temp; } void main(){ char *s= "ha"; char *t= "Oh"; printf("%s and %s \n",s,t); // prints ha Oh swapString(&s,&t); printf("%s and %s \n",s,t); // prints Oh ha int a=10; int b=5; printf("%d %d\n",a,b); //print 10 5 intSwap(&a,&b); printf("%d %d\n",a,b); //print 5 10 }
Как вы можете видеть, я использовал двоичную операцию XOR для intSwap. Однако, когда я пытался сделать то же самое с swapString, он не работает.
Я получаю сообщение об ошибке: недопустимые операнды в двоичный ^ (есть «char *» и «char *»)
Вы знаете, как использовать XOR для обмена двумя строковыми литералами? Возможно ли это в C? Спасибо заранее!
У указателей нет побитовых операций. Единственными операциями, которые могут воздействовать на это, кроме разблокировки, являются +
и -
. Таким образом, вам нужно intptr_t
в intptr_t
и обратно.
Во всяком случае, это плохая практика и не спасет вас от каких-либо циклов. Компиляторы будут распознавать свопы с использованием простых назначений и оптимизировать их для вас.
Если вы используете C99 или выше, вам необходимо intptr_t
char *
в intptr_t
перед началом работы, а затем вернуть обратно в char *
после работы.
Ваше сообщение об ошибке:
недействительные операнды в двоичные ^ (имеют ‘char *’ и ‘char *’)
Сообщает вам, что, пока вы правильно поняли концепцию, оператор ^
не работает над указателями.
Обратите внимание, что если ваша цель состоит в том, чтобы сделать это без использования дополнительной переменной (обратите внимание, что это не является более эффективным для современных компиляторов), вы можете сделать это, используя сложение и вычитание, которые указатели поддерживают достаточно хорошо. Подробнее см. На этом сайте .
intptr_t
– целочисленный тип, предназначенный для хранения значений указателя. Примечание. intptr_t
не является строго говоря полностью переносимым (не может быть целочисленного типа, который может содержать указатели) на этот SO-ответ .
* А = * Ь; означает, что один символ из b будет скопирован на не всю строку, то же самое относится к функции swapString, поэтому это приведет к неправильному значению.
Если вы попробуете то же самое с длиной строки 1, это будет работать. Спасибо Vijayky