交换字符串不使用双指针

时间:2018-05-06 21:33:54

标签: c string

这实际上只是我在算法和数据结构中的原始作业的一小部分。在某些时候,我应该编写一个函数来交换字符串数组中的两个元素。

我们必须使用的原型是:

void swap(char *a, char *b);

对我而言,将双指针传递给此函数更有意义(如果交换字符串)。事实上,我不知道如何在不使用双指针的情况下使他们的原型工作。我错过了什么或者这是错的吗?

我前段时间对此进行过研究,这里有很多已回答的问题,我只是想知道设计此作业的人是否犯了错误。

1 个答案:

答案 0 :(得分:3)

您可以通过创建一个长度等于两个字符串之一的临时char数组并使用strcpy()来交换两个字符串。

当然,您需要确保交换不会溢出两个字符串/数组中的一个。以下是一个示例示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void swap(char *a, char *b)
{
    char *tmp = malloc(strlen(a) + 1);

    strcpy(tmp, a);
    strcpy(a, b);
    strcpy(b, tmp);

    free(tmp);
}

int main(void)
{
    char str_a[50] = "Hello world";
    char str_b[50] = "What's up";

    swap(str_a, str_b);

    puts(str_a);
    puts(str_b);

    return 0;
}

另一种方法是使用带有单个char变量的循环,从而避免动态内存分配:

void swap(char *a, char *b)
{
    char tmp;

    while (*a && *b)
    {
        tmp = *a;
        *a++ = *b;
        *b++ = tmp;
    }

    if (!*a)
    {
        size_t n = 0;
        while (b[n])
        {
            *a++ = b[n++];
        }
    }
    else if (!*b)
    {
        size_t n = 0;
        while (a[n])
        {
            *b++ = a[n++];
        }
    }
    *a = '\0';
    *b = '\0';
}