算法思路:首先先将整个数组逆序,然后将数组中每个单词逆序
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)//自己实现strlen函数
{
int count=0;
assert(str!=NULL);//规定str不能为空指针,断言,优化函数
while(*str)//解引用,取元素
{
count++;
str++;
}
return count;
}
void reverse_str(char *left,char *right)//逆序函数
{
assert(left!=NULL);
assert(right!=NULL);
while(left<right)
{
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void reverse(char *str)
{
char *left=str;
char *right=str+my_strlen(str)-1;
char *ret=str;
reverse_str(left,right);
while(*ret)//逆序每个单词
{
char *start=ret;//解引用,为首元素
while((*ret!=' ')&&(*ret!='\0'))//单词之间用' '断开,且数组以'/0'结束
{
ret++;
}
reverse_str(start,ret-1);//调用逆序函数
if(*ret==' ')//只有当ret为' '的时候,ret才++跳过' ',逆序下一个单词
{
ret++;
}
}
}
int main()
{
char arr[]="student a am i";
reverse(arr);
printf("%s",arr);
return 0;
}
assert
()宏是用于保证满足某个特定条件,用法是:
assert(表达式);
如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。
使用这个宏前需要包含头文件assert.h
使用这个宏前需要包含头文件assert.h
const的使用:1.当const修饰指针的时候const放在*的左边,指针指向的内容是不能通过
指针来改变的,指针变量本身可以改变
2.当const放在*的右边,指针指向的内容可以通过指针来改变,但指针变量本身不能被改变
2.当const放在*的右边,指针指向的内容可以通过指针来改变,但指针变量本身不能被改变