给定程序MODI1.C中, 函数fun的功能是:逐个判断字符串s2中的字符是否在字符串s1中出现过, 并把出现过的字符按照原来在s2中的顺序形成新字符串s3, 不去除重复字符。 例如, 当s1为:"abcdefghijk", s2为:"zbcyedmnpggn" 时, 则s3应该是:"bcedgg" 请改正函数fun中指定部位的错误, 使它能得出正确的结果。 注意:不要改动main函数, 不得增行或删行, 也不得更改程序的结构 !
考点:函数
MODI1.C代码文件
#include <stdio.h>
#include <string.h>
void fun( char *s1, char *s2, char *s3)
{ int i,j,k=0;
for(i = 0; i<strlen(s2); i++)
{ for(j = 0; j<strlen(s1); j++)
/**********************found***********************/
if (s2[i] != s1[j])
break;
/**********************found***********************/
if (j>=strlen(s1))
/**********************found***********************/
s3[++k]=s2[i];
}
s3[k] = '\0';
}
void main()
{ char s1[128], s2[128], s3[128];
printf("Please input string1:");
gets(s1);
printf("Please input string2:");
gets(s2);
fun(s1,s2,s3);
printf("string:%s\n", s3);
}
试题解读:
(1) 根据题意, fun函数在循环中需要判断s2[i]是否在s1中出现, 所以将s2[i]与s1的每一个字符进行比较, 如果与s1[j]相等, 说明s2[i]在s1中出现了, 跳出s1的循环, 第一空修改为:if (s2[i] == s1[j]) 。
(2) 内嵌的s1循环结束后, 需要判断j是否遍历完s1字符串, 若j小于strlen(s1), 说明在内嵌的循环中执行了break语句, 满足s2[i] == s1[j], s2[i]在s1中出现了, 需要存放到s3中; 若j不小于strlen(s1), 说明内嵌的for循环是循环条件不满足终止的, s2[i]在s1中未出现, 不需要存放到s3中; 所以第二空修改为:if (j < strlen(s1)) 。
(3) 由(2)可知若j小于strlen(s1), 说明在内嵌的循环中执行了break语句, 满足s2[i] == s1[j], s2[i]在s1中出现了, 需要存放到s3中, 由于k初值为0, 所以k表示当前应该存放的下标, s2[i]存放到s3[k]中后, k再自增1。
参考答案:
(1) if (s2[i] == s1[j])
(2) if (j < strlen(s1))
(3) s3[k++] = s2[i];
---------------------------------------------------------------------------------------------------------------------------------
编程训练营APP
计算机二级考试学习刷题工具
安卓手机应用商店
搜索编程训练营下载 ?
|