如何在C中交换字符串?

时间:2016-11-08 10:55:03

标签: c

我正在尝试在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

2 个答案:

答案 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中需要两个临时字符串(temporaryname2strswap()) - 一个就够了。

答案 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'表示字符串已结束。