1. 大体思路
主要是将字符串的第一个元素和最后一个元素用指针定位并且解引用出来进行交换,然后将两指针向中间靠,一边靠一边解引用并且交换,这是一个循环
2.代码及其解析
#pragma warning(disable:4996)
#define CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>reserve(char* str)
{
char* left = str;//用指针找到字符串的做左边字符的地址
char* right = str+strlen(str) - 1;//如何找到最右边的地址,这里可以用数组下标从零开始的思维去考虑.
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main()
{
char str[1000] = { 0 };
scanf("%s", str);
reserve(str);
printf("%s", str);
return 0;
}
3.错误回顾(为啥是 char* right = str+strlen(str) - 1;)
这个交换函数我一开始是这么写的
char left = 0;
char right = sizeof(str) / sizeof(str[0]) - 1;
while (left < right)
{
char temp = str[left];
str[left] = str[right];
str[right] = temp;
}
这里犯了一个典型错误就是把数组(char str[10000]={a,b,c,d,e,f})和字符串 (char str[10000]="abcdef")搞混了,字符串数组的下标可不能像数组下标那样"从'0'开始",它这个得用恰当的指针来表示
字符串数组的数组名可以表示字符串首元素地址,但是它必须要用一个指针变量来表示.
所以这个题目最重点的地方就是如何使用指针去表示字符串数组的下标.
于是便有了char* right = str+strlen(str) - 1;
所以为啥用char* right = str+strlen(str) - 1呢.
以abcdef为例
其实这一题将字符串数组"abcdef"拆开成"a,b,c,d,e,f"然后想象成char str[1000] = { a,b,c,d,e,f };用字符数组的下标从"0"的思维去考量可没关系,毕竟都输数组嘛.