仅使用一个指针即可C交换2个字符,

时间:2019-04-22 22:11:21

标签: c

我需要编写一个函数: 无效交换(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”

1 个答案:

答案 0 :(得分:0)

这显然不是理想的解决方案,但可以为您提供一些帮助。 但是,这仅在具有相同长度的字符串时才有效(如上所述)(或者是,您将不得不分配内存+您需要知道字符串的长度)。但是否则我认为这可以回答您的问题。

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

#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;
}