我已经编写了交换字符串的代码,但我无法交换。问题是什么?如何使用函数swap
?
#include <stdio.h>
void swap( char*,char*);
int main()
{
char *ptr[2] = {"hello", "morning"};
swap(ptr[0], ptr[1]);
printf("%s %s", ptr[0], ptr[1]);
return 0;
}
void swap(char *t1, char*t2)
{
char *t;
t = t1;
t1 = t2;
t2 = t;
}
我还尝试传递(&ptr[0], &ptr[1])
,但此处显示的是segmentation fault
。我还制作了一个字符*p1 = ptr[0], char *p1 = ptr[1]
,然后将&p1
和&p2
传递给swap
,但我仍然遇到了分段错误。
答案 0 :(得分:7)
C函数参数是按值传递的。您将地址的值传递给swap
函数,并期望这些值(地址)发生变化。但只有swap
函数中地址的副本会发生变化。
要更改实际传入的地址,您需要一个附加级别的引用:
void swap(char **t1, char **t2)
{
char *t;
t = *t1;
*t1= *t2;
*t2 = t;
}
并按照swap
swap(&ptr[0], &ptr[1]);
答案 1 :(得分:5)
您需要将指针传递给char数组的指针才能切换它们。通过这样做,您可以交换这些指针的值。 (哪些是实际的数组。)
#include<stdio.h>
void swap( char**,char**);
int main()
{
char *ptr[2] = {"hello","mornig"};
swap(&ptr[0], &ptr[1]);
printf("%s %s",ptr[0], ptr[1]);
return 0;
}
void swap( char **t1,char **t2)
{
char *t;
t = *t1;
*t1 = *t2;
*t2 =t;
}
答案 2 :(得分:3)
您需要将指针传递给字符串以交换它们(char **)。否则,您所做的更改将是交换功能的本地更改。
void swap( char **t1,char **t2)
{
char *t;
t = *t1;
*t1 = *t2;
*t2 =t;
}
int main()
{
char *ptr[2] = {"hello","mornig"};
swap(&ptr[0], &ptr[1]);
printf("%s %s",ptr[0],ptr[1]);
return 0;
}
答案 3 :(得分:1)
char *ptr[2] = {"hello","mornig"};
- 此语句表示您正在分配一个大小为2的数组,该数组将存储两个字符串的地址(即char *
)。现在,您提供的两个字符串将位于text segment
中,这是一个只读数据。如果我们试图修改它,这将导致崩溃(分段错误)。
因此,如果您致电swap(&ptr[0], &ptr[1])
导致崩溃。因为您试图在第一个只读字符串m
中编写字符h
。无法写入text segment
中的字符串。
如果您只想交换一个字符串,可以将该函数称为swap(&ptr[0], &ptr[1])
,这相当于swap((ptr + 0),(ptr + 1));
。
并按以下方式更改交换功能
void swap( char **t1,char **t2)
{
char *t;
t = *t1;
*t1 = *t2;
*t2 =t;
}
这里我们只是交换存储在数组指针ptr
中的字符串的地址。