类型的指针,即为 char * a;。所以指针 s 指向传入的字符串的第一个字母,所以可以使用 s
作为指示器 A 的初始值。而每次循环 i 都加一,在 C 语言语法中,一个指针加上一个整数
表示一个新指针,该指针指向原指针向后移动所加上整数个数的位置,所以 s+1 指向字
母"b",s+2 指向字母"c",依次类推。
那为什么 s+n-1-i 可以作为指示器 B 呢?如果传入的字符串为"abcde",s 指针指向字
母"a",n 为字符串为"abcde"的长度,即字符串"abcde"的字母个数,即为 5。一个指针加上
一个整数表示一个新指针,该指针指向原指针向后移动所加上整数个数的位置,所以 s+5
表示指向从字母"a"向后移动 5 个位置的新指针,即字母"e"后面一个位置,而我们希望指
示器 B 指向字母"e",所以 s+n-1 才是指示器 B 的初始值。每次循环 i 都加一,在 C 语言语
法中,一个指针减去一个整数表示一个新指针,该指针指向原指针向前移动所减去整数
个数的位置。例如 s+n-1 指向字母"e",s+n-1-1 指向字母"d",s+n-1-2 指向字母"c",依次类
推。
进行逆置的 for 循环终止条件是判断指示器 A 的位置是否在指示器 B 的位置的右边,那
么循环继续的条件就是指示器 A 的位置应该在指示器 B 的位置的左边。根据 C 语言的语
法,指针 P1 在指针 P2 的左边可以使用 P1<P2 表示。所以 fun 函数第一个填空处应该填写
指示器 A<指示器 B,即 s+i<s+n-1-i。
分析到这里,fun 函数剩下的两个填空应该填写什么呢?for 循环体中应该进行指示器 A
和指示器 B 两个位置的字母互换。t=*(s+i);语句先把指示器 A 位置的字母保存在 t 变量中,
然后将指示器 B 位置的字母覆盖指示器 A 位置的字母,然后将预先保留在 t 变量中的指
示器 A 位置的字母覆盖指示器 B 位置的字母,这样即完成两个位置的字母互换。
根据 C 语言的语法,取得指针指向位置的值应该使用*运算符。所以指示器 A 位置的字
母使用*(s+i)表示,而指示器 B 位置的字母使用*(s+n-1-i)表示,所以第二处填空处应该填
写*(s+i)=*(s+n-1-i),而第三处填空处应该填写*(s+n-1-i)=t。
程序注解如下:
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
/* fun 函数的功能是把字符串中的内容逆置 */
void fun(char *s)
{
/* 定义存放要逆置的字符串的字符数组 */
int i=0,t,n=strlen(s);
for(;s+i<s+n-1-i;i++)
{
t=*(s+i);
*(s+i)=*(s+n-1-i);
*(s+n-1-i)=t;
}
}
main()
{
/* 定义存放要逆置的字符串的字符数组 */
char a[N];
/* clrscr 函数定义在 conio.h 头文件中,所以需要#include <conio.h> */
/* clrscr 函数的作用是进行清屏 */
/* 所谓清屏是指将已经显示在 DOS 窗口的所有内容清除 */
clrscr();
/* 在已经进行清屏的 DOS 窗口中显示"Enter a string:"的提示信息 */
printf("Enter a string:");
/* gets 函数定义在 stdio.h 头文件中,所以需要#include < stdio.h > */
/* gets 函数的作用是接收用户从键盘上输入字符串,然后放入参数 a 数组中 */
gets(a);
/* 在 DOS 窗口中显示"The original string is:"的提示信息 */
printf("The original string is:");
/* puts 函数定义在 stdio.h 头文件中,所以需要#include < stdio.h > */