我正在尝试在C中创建一个函数,它将交换两个字符串变量,但出现问题并且程序崩溃。
请查看我的代码并告诉我哪里出错:
#include <string.h>
void strswap(char name1[], char name2[]) // to swap two strings
{
int lengthname1, lengthname2;
lengthname1 = strlen(name1);
lengthname2 = strlen(name2);
char temporaryname1[100];
char temporaryname2[100];
int x;
int y;
// till just the declaration
for (int x = 0; x < lengthname1; lengthname1++) {
temporaryname1[x] = name1[x];
name1[x] = ' ';
}
// copying the value of name1 in temporaryname1
for (int y = 0; y < lengthname2; lengthname2++) {
temporaryname2[x] = name2[x];
name2[x] = ' ';
}
// copying the value of name2 in temporaryname2
for (int x = 0; x < lengthname1; lengthname1++) {
name1[x] = temporaryname2[x];
}
for (int y = 0; y < lengthname2; lengthname2++) {
name2[x] = temporaryname1[x];
}
}
#include <stdio.h>
int main()
{
char name[] = "hello";
char name2[] = "hi";
printf("before swapping: %s %s\n", name, name2);
strswap(name, name2);
printf("after swapping: %s %s\n", name, name2);
}
编辑: - 我已经纠正了程序并且它正常工作。不久我的头文件将与其他一些模块一起使用。谢谢大家的帮助,特别是@Micheal
答案 0 :(得分:7)
有很多问题:
x
变量未初始化:
int x; int y; // first declaration of x
// till just the declaration
for(int x=0;x<lengthname1;lengthname1++)
{// ^ second declaration of x , local to the loop
temporaryname1[x]=name1[x];
name1[x]=' ';
}
// if you use x here it's the first x that has never been initialized
此:
for (x = 0; x<lengthname1; lengthname1++)
应该是:
for (x = 0; x<lengthname1 + 1; x++)
为什么lengthname1 + 1
?因为您需要复制终止字符串的NUL字符。
您的其他for
循环也存在类似的问题。
例如,您可以使用y
作为循环变量,但在循环中使用x
:
for (int y = 0; y<lengthname2 + 1; lengthname2++)
{
name2[x] = temporaryname1[x];
在main
中声明:
char name[] = "hello";
char name2[] = "hi";
这实际上与
相同char name[6] = "hello"; // 5 chars for "hello" + 1 char for the terminating NUL
char name2[3] = "hi"; // 2 chars for "hi" + 1 char for the terminating NUL
现在即使你的strswap
是正确的,你也试图将name
数组(“hello”)中的6个字节填充到3个字节的数组name2
中,没有name2
数组中有足够的空间。这是未定义的行为。
这根本没用:
name1[x] = ' ';
您应该问问自己为什么在temporaryname1
中需要两个临时字符串(temporaryname2
和strswap()
) - 一个就够了。
答案 1 :(得分:0)
void strswap(char ** name1, char ** name2)
{
char * name1_1 = malloc(strlen(*name2) + 1);
char * name2_1 = malloc(strlen(*name1) + 1);
strncpy(name1_1, *name2, strlen(*name2) + 1);
strncpy(name2_1, *name1, strlen(*name1) + 1);
*name1 = name1_1;
*name2 = name2_1;
}
int main()
{
char * name="hello";
char * name2="hi";
printf("before swapping %s %s\n",name,name2);
strswap(&name, &name2);
printf("after swapping %s %s\n",name,name2);
return 0;
}
实际上以下是交换两个字符串最安全的方法。在您的情况下,您静态使用大小为100的字符串,这是不好的,并且在所有情况下都可以使用。此外,您尝试使用''而不是'\ 0'来标记字符串的结尾。 String API使用'\ 0'表示字符串已结束。