我试图通过仅使用指针表示法(无数组)来交换两个字符串 一个看起来像这样的函数
void str_switch(char *a, char *b)
无论b和a的大小如何,交换都应该有效,并且不知道。
我的想法是:
void str_switch(char *a, char *b) {
const char *temp = a;
strcpy(b, temp);
}
然而,在此之后,我不知道如何将b复制到a,因为b更改,我尝试声明其他常量指针,但是一旦我改变了b,我就永远无法获得旧版本。
答案 0 :(得分:2)
这偏离了你的问题,尤其是在strcpy
未被使用的情况下,并按照您对Martin James的评论:
void str_switch(char **a, char **b) {
char *tmp = *a;
*a = *b;
*b = tmp;
}
如果你真的想使用strcpy
,你必须知道C字符串的大小。
答案 1 :(得分:1)
如果您不想分配额外的存储空间,则需要通过一次交换一个字符来切换字符串。
如果您可以分配额外的存储空间,strdup
a,strcpy
b,a,strcpy
a副本到b,然后free
副本。
答案 2 :(得分:1)
如果您的字符串使用malloc()
等函数存储在已分配的内存中;因此,此代码适用于该情况,尤其是处理不同大小和长度的字符串
#include <stdio.h> // list of libraries that need to be included
#include <stdlib.h>
#include <string.h>
void str_switch(char **a, char **b) {
if (strlen(*a)>strlen(*b)) // check the strings with lowest size to reallocate
{ // in order to fit the big one
char *temp=malloc((strlen(*a)+1)*sizeof(char)); // temp variable to preserve the lowest
// the variable with lowest length
strcpy(temp,*a); // store the longest string in its new location
strcpy(*a,*b);
free(*b); // free the allocated memory as we no longer need it
*b=temp; // assign the new address location for the lowest string
}
else if (strlen(*b)>strlen(*a)) // the same as above but invert a to b and b to a
{
char *temp=malloc((strlen(*b)+1)*sizeof(char));
strcpy(temp,*b);
strcpy(*b,*a);
free(*a);
*a=temp;
}
else // if the lengths are equal ==> @Morpfh solution
{
char *tmp = *a;
*a = *b;
*b = tmp;
}
}
这是对上述功能的测试(主要代码)
int main(int argc, char *argv[])
{
char *a=malloc(sizeof(char)*6);
strcpy(a,"hello");
char *b=malloc(sizeof(char)*4);
strcpy(b,"bye");
printf("a=%s\nb=%s\n",a,b);
str_switch(&a,&b);
printf("----------------------\n");
printf("a=%s\nb=%s\n",a,b);
return 0;
}
我们得到了
a=hello
b=bye
----------------------
a=bye
b=hello