题:有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
分析:假设有两个指针变量p,q分别指向字母s和字母i,将指针p,q对应的元素交换之后,p++,q--重复进行交换,直至q>=p;
但之后会发现字符数组变为i ma a tneduts,仍需要交换每个字母,所以最好的做法是将交换写成函数。
i ma a tneduts,要使单个单词进行交换,首先我们应该看出除第一个单词‘ i ’外一个单词的开始前一个字符必为空格,一个单词的结束后一个字符必为空格.为此我们设置一个静态变量s,先将s=0找到字母的开始后将s赋为1去找字母的结尾;
代码如下:
#include<stdio.h>
#include<stdlib.h>
交换函数:
void exchange(char *x,char *y)
{
while (x<y)
{
char temp = 0;
temp = *y;
*y = *x;
*x = temp;
x++;
y--;
}
}
求字符串的长度:
int length(char *a)
{
int i=0;
while (a[i] != '\0')
{
i++;
}
return i;
}
主函数:
int main()
{
char a[] = "student a am i";
int len = length(a);
exchange(a, a + len - 1); //传函数左右下标地址
printf("%s\n", a); //i ma a tneduts
int s = 0;
char *p ;
char *q ;
int i;
for (i = 0; i < len; i++)
{
if ((s == 0) && (a[i] != ' ')) //找到字母下标,将地址赋给p;
{
p = a + i;
s = 1;
}
else if ((s == 1) && (a[i] == ' '))
{
q = a + i - 1; //找到空格下标,
s = 0;
exchange(p, q);
}
}
exchange(p, a + len - 1); //最后一个单词由于之后没有空格,没有确定下标q,所以循环内部没有交换
printf("%s", a);
system("pause");
return 0;
}
运行结果: