首页 > 解决方案 > C - 仅用一个指针递归交换 2 个字符

问题描述

我需要写一个函数:void swap (char * s1, char * s2);

该函数将替换字符串 1s 和 2s 的内容。约束:在函数中,没有在任何地方使用 [],而是通过使用指针来表现,此外,必须与选民进行旅行,这意味着他们实际上会根据需要移动到另一个单元格,并且不会留在一直在同一个位置。•函数中没有循环,即以递归方式工作。

我使用指向指针 str** 的指针完成了该函数,但必须将其更改为仅一个指针 str 并递归地。我怎样才能改变它?

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

int main()
{
char *str1="abc",*str2="xyz",*pRev;
 swap(&str1, &str2); 
 printf("str1 is %s, str2 is %s", str1, str2); 
 getchar(); 
  return 0;
}
//need *str NOT **str
  void swap(char **str1, char **str2);
    char * RevWords (char * str, int size);
    void swap(char **str1, char **str2) 
    { 
      char *temp = *str1_ptr; 
      *str1_ptr = *str2_ptr; 
      *str2_ptr = temp; 
    }   

交换后方法:

str2="abc", str1="xyz"

标签: c

解决方案


好吧,这显然不是一个理想的解决方案,但可以为您提供一些工作。但是,这仅在您具有相同长度的字符串时才有效(如上所述)(或者是的,您必须分配内存+您需要知道字符串的长度)。但除此之外,我认为这可能会回答你的问题。

这适用于递归,并且取决于两个字符串的长度相同并且在每个字符串的末尾都包含一个零字符的事实。

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

void swap(char* str1, char* str2)
{
    // if both of them are zero characters then stop
    if (*str1 == '\0' && *str2 == '\0')
        return;
    // else swap the contents of the pointers
    else
    {
        char tmp = *str1;
        *str1 = *str2;
        *str2 = tmp;
        // advance both pointer and swap them too if thye are not '\0'
        swap(++str1, ++str2);        
    }
}

int main()
{
    char str1[] = "abc\0\0\0"; // padded with zeros to be the same length as str2
    char str2[] = "xyz123"; // the last '\0' is automatically added

    swap(str1, str2);
    printf("str1 is %s, str2 is %s", str1, str2);
    getchar();

    return 0;
}

推荐阅读