开门见山的说:
目录
字符串逆序问题:
#include<stdio.h>
int my_strlen(char* brr)//模拟实现strlen
{
static int c = 0;
if (*brr != '\0')
{
my_strlen(brr + 1);
c++;
}
return c;
}
void exchange(char* ar, int left,int right)//交换字符
{
char tmp;
if (left < right)
{
tmp = *(ar + left);
*(ar + left) = *(ar + right);
*(ar + right) = tmp;
left++;
right--;
exchange(ar, left, right);
}
}
int main()
{
char arr[] = { "abcdefg" };
int left =0;
int right = my_strlen(arr)-1 ;
exchange(&arr, left, right);
printf("%s", arr);
}
我们来看看交换的核心
if (left < right)
{
tmp = *(ar + left);
*(ar + left) = *(ar + right);
*(ar + right) = tmp;
left++;
right--;
exchange(ar, left, right);
}
采用首尾交换的方式,两个指针不断向中间靠拢,通过循环交换直到到达中间位置
逆置单词问题:
比如我们要将
i like you 变为 you like i
那么我们在知道字符串逆序的基础上很容易就可以想到单词逆置的关键。
核心:
while (*l != '\0')
{
while (*r != ' ' && *r != '\0')
{
r++;
}
exchange(l, r-1);
l = r + 1;
r = l;
}
#include<stdio.h>
#include<string.h>
#include<assert.h>
void exchange(char*l,char* r)
{
assert( l&& r);
int right = *r-*l;
int left = 0;
char tmp ;
while (l <r)
{
tmp = *l;
*l = *r;
*r= tmp;
l++;
r--;
}
}
int main()
{
char arr[100]={"a b c d"};
gets(arr);
char* l = arr;
char* r =arr+ strlen(l) - 1;
exchange(l, r);
l = arr;
r = arr;
while (*l != '\0')
{
while (*r != ' ' && *r != '\0')
{
r++;
}
exchange(l, r-1);
l = r + 1;
r = l;
}
printf("%s", arr);
return 0;
}