指针在void函数中交换值,但不会返回交换值

时间:2017-09-22 07:52:42

标签: c string pointers

我试图交换两个作为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);
}

3 个答案:

答案 0 :(得分:0)

我命令交换字符串,首先你不能使用常量字符串文字,因为它们是不可变的。将字符串文字分配给char *被认为是不好的做法,除非您正确地知道自己想要实现的目标。另请阅读此linkthis。您应该使用静态/动态分配的字符串。

正如其他人所说,您按值传递字符指针,因此您在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'