mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
1013 字
3 分钟
考试套题-第四套
2026-06-15

C 语言考试套题 - 第四套#

本套题包含填空题、改错题、程序设计题三个部分,涵盖字符串过滤、指针排序、数位拆分合并等核心考点。


一、填空题:删除字符串中的指定字符#

题目说明#

功能:删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。

解题思路#

采用”双指针(双下标)覆盖法”删除指定字符:

  1. i 遍历原字符串的每个字符
  2. k 记录保留字符的存放位置
  3. str[i] 不等于要删除的字符 ch 时,将其复制到 str[k] 并让 k 自增
  4. 遍历结束后,在 str[k] 处补上字符串结束符 '\0'

这种方法原地修改字符串,无需额外数组空间。

完整代码#

#include <stdio.h>
main()
{
char str[80], ch;
int i, k = 0;
/* 填空1:读取字符串(含空格用gets) */
gets(str);
/* 读取要删除的字符 */
ch = getchar();
/* 填空2:遍历字符串直到结束符'\0' */
for (i = 0; str[i] != '\0'; i++)
if (str[i] != ch)
{
/* 填空3:保留的字符前移到位置k */
str[k] = str[i];
k++;
}
/* 填空4:在新字符串末尾添加结束符'\0' */
str[k] = '\0';
puts(str);
}

关键考点#

  • 双下标覆盖法:用一个下标遍历、另一个下标写入,实现原地删除
  • 字符串结束符 '\0':C 字符串以 '\0' 结尾,删除后必须补上
  • getsgetchar 的配合gets 读整行字符串,getchar 读单个字符
  • 字符串遍历for (i = 0; str[i] != '\0'; i++) 是标准遍历模式

二、改错题:三个数排序#

题目说明#

下列给定程序中函数 fun 的功能是:把从主函数中输入的 3 个数,最大的数放在 a 中,中间的数放在 b 中,最小的数放在 c 中。

例如:若输入的数为:55 12 34,输出的结果应当是:a=55.0,b=34.0,c=12.0。

错误分析与修正#

该程序有两处 FOUND 标记:

错误 1:临时变量类型错误

  • 原错误写法:int k;
  • 修正写法:float k;
  • 错误原因:函数处理的是 float 类型的数据,若临时变量 kint,交换时会发生截断丢失小数部分。

错误 2:比较方向错误

  • 原错误写法:if (*a > *c)(写成大于)
  • 修正写法:if (*a < *c)
  • 错误原因:目标是让 a 存最大值。当 ac 小时才需要交换,使较大的值进入 a。若写成 > 则逻辑相反。

完整代码#

#include <stdio.h>
void fun(float* a, float* b, float* c)
{
/* 修正1:临时变量k应为float类型,与数据类型一致 */
float k;
/* 第1步:保证a >= b */
if (*a < *b)
{
k = *a;
*a = *b;
*b = k;
}
/* 修正2:当a < c时交换,保证a中存最大值 */
if (*a < *c)
{
k = *c;
*c = *a;
*a = k;
}
/* 第3步:保证b >= c,使b存中间值,c存最小值 */
if (*b < *c)
{
k = *b;
*b = *c;
*c = k;
}
}
main()
{
float a, b, c;
printf("Input a b c: ");
scanf("%f%f%f", &a, &b, &c);
printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n", a, b, c);
fun(&a, &b, &c);
printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n", a, b, c);
}

关键考点#

  • 指针参数与解引用:通过 *a*b*c 修改主调函数的变量
  • 变量类型匹配:临时变量的类型必须与交换数据类型一致
  • 比较交换排序:通过两两比较交换,实现三个数的排序
  • 指针传址调用fun(&a, &b, &c) 传入地址,函数内可修改原变量

三、程序设计题:两位数合并#

题目说明#

函数 fun 的功能是:将 ab 的两个两位正整数合并成一个新的整数放在 c 中。

合并的方式是:将 a 中的十位和个位数依次放在变量 c 的百位和个位上,b 中的十位和个位数依次放在变量 c 的千位和十位上。

例如:当 a=45,b=12,调用该函数后 c=1425。

注意:请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

解题思路#

c 拆解为千位、百位、十位、个位四个部分,分别填入对应数字:

  • c 的千位 = b 的十位 = b / 10,需乘 1000
  • c 的百位 = a 的十位 = a / 10,需乘 100
  • c 的十位 = b 的个位 = b % 10,需乘 10
  • c 的个位 = a 的个位 = a % 10,需乘 1

验证:a=45, b=12

  • b/10=1 → 1000
  • a/10=4 → 400
  • b%10=2 → 20
  • a%10=5 → 5
  • 合计:1000+400+20+5 = 1425 ✓

完整代码#

#include <stdio.h>
void fun(int a, int b, long* c)
{
/**********Program**********/
/* a的十位放c百位,a的个位放c个位 */
/* b的十位放c千位,b的个位放c十位 */
*c = a % 10 + (b % 10) * 10 + (a / 10) * 100 + (b / 10) * 1000;
/********** End **********/
}
void main() /* 主函数 */
{
int a, b;
long c;
printf("Input a, b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
}

关键考点#

  • 数位拆分a / 10 取十位,a % 10 取个位
  • 数位合并:通过乘以不同权值(1、10、100、1000)拼接到对应位置
  • 指针输出参数long* c 通过解引用 *c = ... 将结果写回主调函数
  • 数据类型选择:结果用 long 类型存储,避免溢出
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

考试套题-第四套
https://blog.radarweb.top/posts/c/考试套题-第四套/
作者
Sherry
发布于
2026-06-15
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录