我试图交换两个作为char
指针传入的字符串。
在调试中,我在被调用函数的末尾得到了正确的答案,但在函数结束后返回值返回的值与传入的值相同。这是代码
#include <stdio.h>
int main(int argc, char const *argv[]) {
char *s1, *s2;
s1 = "12345678";
s2 = "87654321";
printf("s1 is %s\n", s1);
printf("s2 is %s\n", s2);
strswap(s1, s2);
printf("s1 is now %s\n", s1);
printf("s2 is now %s\n", s2);
}
以及函数本身的代码
#include <stdio.h>
void strswap(char *s1, char *s2){
char *temp;
temp = s1;
printf("temp: %s\n", temp);
s1 = s2;
printf("s1: %s\n", s1);
s2 = temp;
printf("s1: %s\n", s1);
printf("s2: %s\n", s2);
printf("temp: %s\n", temp);
}
答案 0 :(得分:0)
我命令交换字符串,首先你不能使用常量字符串文字,因为它们是不可变的。将字符串文字分配给char *
被认为是不好的做法,除非您正确地知道自己想要实现的目标。另请阅读此link和this。您应该使用静态/动态分配的字符串。
正如其他人所说,您按值传递字符指针,因此您在strswap()
中所做的任何更改都不会反映在main函数中。由于某些局部变量被修改,并且当控制超出这些函数时它们会被破坏。您应该像上面提到的答案之一那样通过char **
。我建议使用静态分配的字符串,并使用strcpy
进行字符串复制操作,如下所示:
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1000
void strswap(char *s1, char *s2){
char tempStr[MAX_SIZE];
strcpy(tempStr, s1);
strcpy(s1, s2);
strcpy(s2, tempStr);
}
int main(int argc, char const *argv[]) {
char aString1[MAX_SIZE] = "Rohan", aString2[MAX_SIZE] = "Rohit";
printf("s1 is %s\n", aString1);
printf("s2 is %s\n", aString2);
strswap(aString1, aString2);
printf("s1 is now %s\n", aString1);
printf("s2 is now %s\n", aString2);
return 0;
}
答案 1 :(得分:-1)
C使用pass-by-value进行函数参数传递。
这里,指针本身是按值传递的,因此对指针所做的任何更改(例如,为它们赋值)都不会反映到调用者的实际参数中。但是,如果对存储在指针指向的内存位置的值进行了任何更改,那么会反映到用于从调用者调用该函数的实际参数。
因此,要更改指针值本身,需要将指针传递给指针。
答案 2 :(得分:-2)
你正在使用字符串文字来初始化指针,你不能用你展示的函数原型交换这些字符串。
假设字符串初始化是一个错误,我们可以通过复制实际字符来进行交换,而无需更改函数的原型。这要求字符串具有相同的长度,否则较长的字符串不能复制到较短的字符串所使用的空间。
这是一次尝试:
void swap_strings(char *a, char *b)
{
const size_t al = strlen(a);
const size_t bl = strlen(b);
if(al != bl)
return;
for(size_t i = 0; i < al; ++i)
{
const char t = a[i];
a[i] = b[i];
b[i] = t;
}
}
我更改了函数的名称,我有一个模糊的回忆,你不应该添加名称以str
开头的函数,这是保留的。
注意:这要求字符串是可写的,因此您不能在字符串文字上使用它。你必须有这样的适当缓冲区(或数组):
char a[] = "foo";
char b[] = "bar";
swap_strings(a, b);
printf("'%s' and '%s'\n", a, b);
这将打印'bar' and 'foo'
。