这个题要我自己写还不太有思路,可能不会想到写三个函数,而且这个代码也没有运行出来
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#pragma warning (disable:4996)
/*有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student*/
void reverve_swap1(char *p,char *q){
assert(p != NULL); //断言不是空指针
assert(q != NULL);
while (p<q){
char tmp;
tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
}
char *reverve_swap2(char *p,int len){
char *left=0;
char *right=len-1;
char *end;
char *start = p;
reverve_swap1(left, right);
while (*p){
start = p;
while ((*p!=' ')&&(*p!='\0')){
p++;
}
end = p - 1;
reverve_swap1(start,end);
if (*p == ' ') //找到空格
p++;
}
return p;
}
int main(){
char a[] = "student a am i";
int len = sizeof(a) / sizeof(a[0]);
printf("before: %c\n",a);
printf("after : %c\n", reverve_swap2(a, len));
system("pause");
return 0;
}
这是网上找的代码可以运行
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void reverve_swap(char *left, char *right)
{
assert(left != NULL); //断言不是空指针
assert(right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
char *reverve(char *p)
{
int len = strlen(p);
char *start = p;
char *end = NULL;
char *ret = p;
reverve_swap(p, p + len - 1); //逆序整个字符串
while (*p)
{
start = p;
while ((*p != ' ') && (*p != '\0')) //找到一块单词
{
p++;
}
end = p - 1;
reverve_swap(start, end);//逆序单个单词
if (*p == ' ') //找到空格
p++;
}
return ret;
}
int main()
{
char arr[] = "student a am I";
printf("交换前:%s\n", arr);
printf("交换后:%s\n", reverve(arr));
system("pause");
return 0;
}