首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

互换两个字符串的内容,错哪儿了?

2013-07-16 
交换两个字符串的内容,错哪儿了???代码如下:#includestdio.hvoid swap(char **x,char **y)int main(){

交换两个字符串的内容,错哪儿了???
代码如下:


#include<stdio.h>
void swap(char **x,char **y);
int main()

char str1[]="GG"; 
char str2[]="KK"; 
char *p1=str1; 
char *p2=str2; 
printf("%s\n",p1); 
printf("%s\n",p2);
swap(&p1,&p2); 
printf("%s\n",p1); 
printf("%s\n",p2);
return 0;
}
void swap(char **x,char **y)
{
char **temp = NULL;
*temp=*x;
*x=*y;
*y=*temp;
}


编译没错,运行出错,求原因?? C 字符串 交换
[解决办法]
void swap(char **x,char **y)
{
    char **temp = NULL;
    *temp=*x;//temp是空指针,对*temp赋值是错误的。
    *x=*y;
    *y=*temp;
}


改为:
void swap(char **x,char **y)
{
    char *temp = NULL;//是否“=NULL”无影响。
    temp=*x;
    *x=*y;
    *y=temp;
}

[解决办法]
字符串赋值要用strcpy:

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
void swap(char **x,char **y);
int main()

    char str1[]="GG"; 
    char str2[]="KK"; 
    char *p1=str1; 
    char *p2=str2; 
    printf("%s\n",p1); 
    printf("%s\n",p2);
    swap(&p1,&p2); 
    printf("%s\n",p1); 
    printf("%s\n",p2);
    return 0;
}
void swap(char **x,char **y)
{
    char* temp = (char*)malloc(strlen(*x) + 1);
    strcpy(temp, *x);
    strcpy(*x,*y);


    strcpy(*y,temp);
    free(temp);
}



引用:
代码如下:

#include<stdio.h>
void swap(char **x,char **y);
int main()

char str1[]="GG"; 
char str2[]="KK"; 
char *p1=str1; 
char *p2=str2; 
printf("%s\n",p1); 
printf("%s\n",p2);
swap(&p1,&p2); 
printf("%s\n",p1); 
printf("%s\n",p2);
return 0;
}
void swap(char **x,char **y)
{
char **temp = NULL;
*temp=*x;
*x=*y;
*y=*temp;
}


编译没错,运行出错,求原因??

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

temp没有分配内存空间,它怎么存储你的字符串

temp只是用来存储字符串的首地址,不需要额外分配空间的么?


temp存储字符串首地址当然不需要额外分配空间,但你的代码是用*temp存储。

我的疑惑就是,**temp在赋初值之后,我只知道**temp是不能赋值的,因为它没有指向分配的内存,但*temp也是不能赋值吗?也没有空间吗?按道理说,它应该可以存储一个四个字节的指针变量的么???


你再分析char**类型的temp时,应该先把char *看成一个单独的类型,这样就很清楚了:

int * pi = NULL;
* pi = 5;//错误,pi是空指针,不能对*pi赋值.

typedef char * pchar;
pchar * ppchar1 = NULL;
* ppchar1 = "abc";//错误,ppchar1是空指针,不能对*ppchar1赋值。

char ** ppchar2 = NULL;
* ppchar2 = "abc";//错误,同上。

[解决办法]
引用:
Quote: 引用:

原因就是你要交换的是字符串的内容,而不是字符串的地址,仔细看每行代码,自然可以领悟。

Quote: 引用:

Quote: 引用:

字符串赋值要用strcpy:

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
void swap(char **x,char **y);
int main()

    char str1[]="GG"; 
    char str2[]="KK"; 
    char *p1=str1; 
    char *p2=str2; 
    printf("%s\n",p1); 
    printf("%s\n",p2);
    swap(&p1,&p2); 


    printf("%s\n",p1); 
    printf("%s\n",p2);
    return 0;
}
void swap(char **x,char **y)
{
    char* temp = (char*)malloc(strlen(*x) + 1);
    strcpy(temp, *x);
    strcpy(*x,*y);
    strcpy(*y,temp);
    free(temp);
}



Quote: 引用:

代码如下:

#include<stdio.h>
void swap(char **x,char **y);
int main()

char str1[]="GG"; 
char str2[]="KK"; 
char *p1=str1; 
char *p2=str2; 
printf("%s\n",p1); 
printf("%s\n",p2);
swap(&p1,&p2); 
printf("%s\n",p1); 
printf("%s\n",p2);
return 0;
}
void swap(char **x,char **y)
{
char **temp = NULL;
*temp=*x;
*x=*y;
*y=*temp;
}


编译没错,运行出错,求原因??

求楼上问题的原因?谢大婶


嗯,我的确要交换两个字符数组的内容。
但是字符数组的内容是由两个字符数组头指针指向的
那么,我只需交换两个字符数组头指针,就可以达到交换数组元素的同样效果,而且这样效率会更高!
问题是,这样实现会有其他问题吗?


你的想法是想把两个指针的值交换下,然后就达到你的预期了。这是可行的,交换两个指针的指向,间接的达到交换字符串的目的

热点排行