问题 填空题

给定程序MODI1.C函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
文件MODI1.C内容如下:
#include<stdio.h>
void fun(char *s)
int i,j;
for(i=0,j=0; s[i]!=’\0’;i++)
if(s[i]>=’0’&& s[i]<=’9’)
/**********found**********/
s[j]=s[i];
/**********found**********/
S[j]="\0";

void main( )
char item[80];
printf("\nEnter a string:");
gets(item);
printf("\n\nThe string is:\"%s\"\n",item);
fun(item);
printf("\n\nThe string of changing is: \"%s\"\n",item);

答案

参考答案:第1处:将“s[j]=s[i];”改为“s[j++]=s[i];”。
第2处:将“s[j]="\0";”改为“s[j]=’\0’;”。

解析: 题目要求将数字字符取出,实际就是将其他字符删除。函数fun中使用的删除算法是:将数字字符往前移动,依次放入s[0]、s[1]、s[2]、……等数组元素中,最后将字符串结束标记放入适当的位置。变量i作为每次取出元素的下标,变量j记录赋值的位置。在for循环中,每次判断当前要处理的字符s[i]是否为数字字符,若是则将其赋值到字符数组相应的单元s[j]中。循环结束后,给新字符串加上字符串结束标记。对于第1处错误,j变量的值始终为0,没有改变,元素下标出现错误,当s[i]赋给s[j]后,j应该自加1,由于题目不允许增加行或删除行,所以只能将下标j改为“j++”;对于第2处错误,混淆了字符和字符串的区别,s[j]是一个字符变量,只能存储一个字符,而“\0”是一个字符串,所以将字符串的结束标记赋值给s[j]只能用单引号括起来。
[归纳总结] 处理数组问题时,错误通常出现在数组元素下标的表示上。数组元素的下标从0开始编号,下标值不能超过数组大小的定义。要修改此类错误,必须弄清楚程序的算法、循环的执行过程、下标的变换规律及程序中数组下标的最小值和最大值是否超过数组的范围,从而发现错误位置。对于字符数组,除了注意数组元素的下标表示外,还要注意字符串的结束标记’\0’的位置及书写方法。
数组处理的常见错误有:
(1)数组元素下标出错,尤其是出现两个数组时,如果采用不同的变量来表示两个数组元素的下标,一定要注意下标名要前后统一。
(2)字符数组中,单引号和双引号的使用错误。如果是字符应该用单引号括起来,如果是字符串应该用双引号括起来;
(3)字符串结束标记’\0’使用错误。

多项选择题
问答题