background image

乘除从右到左?

1.题目

  请补充函数 fun(char  *s),该函数的功能是把字符串中的内容逆置。

  例如:字符串中原有的字符串为 abcde,则调用该函数后,串中的内容为 edcba。
  注意:部分源程序如 blank.c 给出。

  请勿改动主函数 main 和其他函数中的任何内容,仅在 fun 函数的横线上填入所编写的

若干表达式或语句。
  #include <string.h>
  #include <conio.h>

  #include <stdio.h>
  #define N 81

  void fun(char *s)
  {

     int i=0,t,n=strlen(s);
     for(;___1___;i++)

     {
         t=*(s+i);

         ___2___;
         ___3___;

     }
  }

  main()
  {

     char a[N];
     clrscr();

     printf("Enter a string:");
     gets(a);

     printf("The original string is:");
     puts(a);

     fun(a);
     printf("\n");

     printf("The string after modified:");
     puts(a);

  }

3

分析:
  将字符串中的内容逆置主要思路分析如下:
  (1)在字符串第一个字母位置和最后一个字母位置各自设置一个指示器 A 和 B,它们

分别指向第一个字母和最后一个字母,然后 A 位置的字母和 B 位置的字母进行互换。
  (2)互换结束之后指示器 A 移动到第二个字母,而指示器 B 移动到倒数第二个字母,

即指示器 A 往后移动一个字母位置,而指示器 B 往前移动一个字母位置,然后 A 位置的

字母和 B 位置的字母进行互换。
  (3)互换结束之后指示器 A 往后再次移动一个字母位置,而指示器 B 再次往前移动一

个字母位置,然后 A 位置的字母和 B 位置的字母进行互换。
  (4)以上过程反复进行,只有指示器 B 的位置小于指示器 A 的位置,即指示器 B 指向

的位置在指示器 A 指向的位置的左边的情况下才结束,所以以上过程可以使用循环语句

实现,循环终止条件可以判断指示器 B 的位置是否小于指示器 A 的位置。
  为了实现以上思路,我们观察 fun 函数。fun 函数的功能就是将传入的 s 参数作为字符串

进行内容逆置,它的逆置方法和我们分析的思路是一致的。它使用了 for 循环语句进行循

环,循环体中使用指针 s+i 作为指示器 A,而指示器 B 使用 s+n-1-i 表示。其中 i 每次循环

加一,而 n=strlen(s),为传入的字符串的长度。strlen 函数可以得到 s 参数的字符串中包含

的字母个数。
  

为什么指针 s+i 可以作为指示器 A 呢?由于指针 s 对应 main 函数传入的 a 数组,而 C 语

言中数组名称就是一个指向数组第一个元素的指针,所以数组 a 的名称 a 就是一个 char