background image

类型的指针,即为 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 > */