全部问题 > 当前问题

答案如下所示,为什么第一课空不能填 for( i=strlen(t); i>0&&i<20; i--)

/*给定程序MODI1.C中函数 fun 的功能是: 读入一个字符串(长度<20 ),将该字符串中的所有字符按ASCII码升序排序后输出。

例如, 若输入: edcba, 则应输出: abcde。

请改正程序中的错误,使它能统计出正确的结果。

注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!

||

第1问

参考文件

1

【微答案】

(1)for(i=strlen(t)-1; i; i--) 或 for(i=strlen(t)-1; i>0; i--)

(2)if (t[j] > t[j+1])


【微分析】

(1)本题是利用选择法对数组元素进行比较排序。所谓选择法,是依次用当前取得的元素和其后面的元素进行比较,在第一个元素和其后面的元素顺次比较时,可以借助中间变量来对两个数进行交换,要保证第一个元素始终存放数组中的最大数,以后依次挑选出次大数,这样最终的数组就是有序的。strlen函数所求得的字符串长,要想得到最后一个元素的下标需要strlen-1

(2)这里是一个分析逻辑错误,题中要求按升序排序,所以应改为if (t[j] > t[j+1])。*/

#include <stdio.h>

#include <string.h>

void fun( char t[] )

{

  char c;

  int  i, j;

/**********found***********/

  for( i=strlen(t)-1; i>0; i--)

    for( j = 0; j < i; j++ )

/**********found***********/

      if( t[j] >t[ j + 1 ] )

      {

        c = t[j];

        t[j] = t[ j + 1 ];

        t[j + 1 ] = c;

      }

}


main()

{

  char s[81];

  printf( "\nPlease enter a character string: " );

  gets( s );

  printf( "\n\nBefore sorting:\n  \"%s\"", s );

  fun( s );

  printf( "\nAfter sorting decendingly:\n  \"%s\"\n", s );

}


必过 2016-3-3 19:58:04

共 2 个回答

嘿嘿大人 2016-3-4 09:20:28

比如是一个字符串是“12345”,用strlen求出来它的长度是5,但是如果用数组下标来表示,这个‘5’字符却是下标为4的

然后后面blob.png这里的j是+1的,如果前面的i不减去1的话就会越界

比如说现在i最开始等于5;

那么后面就是

 for( j = 0; j < 5; j++ )

/**********found***********/

      if( t[4] >t[ 5 ] )//这就是越界错误


当j等于4的时候后面就会出现


      if( t[j] >t[ j + 1 ] )


必过 2016-3-4 23:41:13

嗯,谢谢

问题来自: 改错题真题