Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 切换两个字符_C_Char - Fatal编程技术网

C 切换两个字符

C 切换两个字符,c,char,C,Char,我想知道我的代码出了什么问题。 它应该交换用户指定的两个单词, 但它什么也没做。帮个小忙就好了 #include <stdio.h> void changeW(char *ptab1, char *ptab2){ char tmp; tmp = *ptab1; *ptab1 = *ptab2; *ptab2 = tmp; printf("%s %s",ptab1,ptab2); return; } int main(void) { char tab1[25]; char tab2

我想知道我的代码出了什么问题。 它应该交换用户指定的两个单词, 但它什么也没做。帮个小忙就好了

#include <stdio.h>

void changeW(char *ptab1, char *ptab2){
char tmp;
tmp = *ptab1;
*ptab1 = *ptab2;
*ptab2 = tmp;
printf("%s %s",ptab1,ptab2);
return;
}
int main(void) {

char tab1[25];
char tab2[25];

printf("type two words");
scanf("%s %s",tab1,tab2);
changeW(tab1,tab2);
return 0;
}
单个空格似乎不足以分隔两个单词,一个制表符就可以了

上次编辑: 事实上,搜索最长的表是无用的,因为tab1和tab2都有25个字符长

for(int i=0; i<25;i++)

for(int i=0;i您只需切换前两个字符。要交换字符串,必须使用循环

#include <stdlib.h>
#include <string.h>

void changeW(char *p1, char *p2, size_t p1_len)
{
    char *tmp = malloc (p1_len); /* or [C99] char tmp[p1_len]; */
    strcpy (tmp, p1);
    strcpy (p1, p2);
    strcpy (p2, tmp);
}
#包括
#包括
无效更改(字符*p1,字符*p2,大小为p1)
{
char*tmp=malloc(p1_len);/*或[C99]char tmp[p1_len]*/
strcpy(tmp,p1);
strcpy(p1,p2);
strcpy(p2,tmp);
}
另一种可能性是交换指针

#include <stdio.h>
#include <stdlib.h>

void swap_strings(char **p1, char **p2)
{
    char *tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

int main (void)
{
    char s1[] = "hello";
    char s2[] = "word";

    char *p1 = s1;
    char *p2 = s2;

    puts(p1);
    puts(p2);

    swap_strings(&p1, &p2);

    puts(p1);
    puts(p2);

    return 0;
}
#包括
#包括
无效交换字符串(字符**p1,字符**p2)
{
char*tmp=*p1;
*p1=*p2;
*p2=tmp;
}
内部主(空)
{
字符s1[]=“你好”;
字符s2[]=“单词”;
char*p1=s1;
char*p2=s2;
看跌期权(p1);
看跌期权(p2);
交换字符串(&p1和&p2);
看跌期权(p1);
看跌期权(p2);
返回0;
}
这项工作的诀窍是,对于任何
a
b
,a
(a^b)^a=a

new_p2 = p2 ^ (p1 ^ p2) = p1
new_p1 = (p1 ^ p2) ^ new_p2 = (p1 ^ p2) ^ p1 = p2

@Dany77:在C99中,有VLAs.printf(“%s%s\n”,tab2,tab1);?…我想更改它们的值,而不是它们的位置哦,谢谢,这就是我想要的。但是^=表示什么呢?@Dany77它是位异或(又称异或)布尔运算。表达式
a^=b
的意思与
a=a^b
的意思相同。嗯……我想这不是我的水平。有没有其他方法可以像你那样交换每个字母,但没有布尔运算?谢谢你的帮助help@Dany77像使用临时变量吗?当然。我编辑了答案来显示这一点。谢谢好多了。但现在我遇到了其他问题,请检查我的编辑:)
#include <stdio.h>
#include <stdlib.h>

void swap_strings(char **p1, char **p2)
{
    char *tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

int main (void)
{
    char s1[] = "hello";
    char s2[] = "word";

    char *p1 = s1;
    char *p2 = s2;

    puts(p1);
    puts(p2);

    swap_strings(&p1, &p2);

    puts(p1);
    puts(p2);

    return 0;
}
void changeW(char *ptab1, char *ptab2)
{
    size_t l1 = strlen(ptab1), l2 = strlen(ptab2);
    size_t l = l1 > l2 ? l1 : l2;
    size_t i;
    for (i = 0; i <= l; i++) {
        char tmp = ptab1[i];
        ptab1[i] = ptab2[i];
        ptab2[i] = tmp;
    }
}
void changeW(char *ptab1, char *ptab2)
{
    size_t l1 = strlen(ptab1), l2 = strlen(ptab2);
    size_t l = l1 > l2 ? l1 : l2;
    size_t i;
    for (i = 0; i <= l; i++) {
        ptab1[i] ^= ptab2[i];
        ptab2[i] ^= ptab1[i];
        ptab1[i] ^= ptab2[i];
    }
}
0^0=0
0^1=1
1^0=1
1^1=0
new_p2 = p2 ^ (p1 ^ p2) = p1
new_p1 = (p1 ^ p2) ^ new_p2 = (p1 ^ p2) ^ p1 = p2