NOIP 普及组初赛 · NOIP 2007 普及组初赛试题 第 27 题

完善程序 · 答案 i++i=i+1i+=1++ij--j=j-1j-=1--jkz!=-1reverse(line) · 考点:字符数组与字符串处理、前缀和与差分

← 整套速查表 NOIP 普及组初赛 全部真题

题目

完善程序: (求字符的逆序)下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入 $-1$ 终止程序。请将程序补充完整。

#include <iostream.h>
#include <string.h>
int maxline = 200, kz;
int reverse( char s[] )
{
	int i, j, t;
	for ( i = 0, j = strlen( s ) - 1; i < j; 【①】 , 【②】 )
	{
		t = s[i]; s[i] = s[j]; s[j] = t;
	}
	return(0);
}


int main()
{
	char line[100];
	cout << "continue? -1 for end." <<endl;
	cin>>kz;
	while(【③】)
	{
		cin  >>  line;
		【④】;
		cout << line  <<  endl;
		cout << "continue ? -1 for end." << endl;
		cin >> kz;
	}
}
答案:i++i=i+1i+=1++ij--j=j-1j-=1--jkz!=-1reverse(line)

考点

字符数组与字符串处理 讲解 →字符数组与字符串处理 真题汇总 →前缀和与差分 讲解 →前缀和与差分 真题汇总 →

解题思维

这道题考的是字符串反转函数的双指针写法。拿到题先看函数头,i 从 0 开始,j 从末尾开始,中间交换,那循环条件肯定是 i 小于 j,然后每次交换完 i 得往后挪、j 得往前挪,填 i++ 和 j-- 就对了。

常见错误

最容易错的就是把 i 和 j 的更新写反,或者只写 i++ 忘了 j--,这样最后字符串会乱成一团。还有很多人会纠结要不要用 i++ 还是 ++i,其实编译器都优化成机器指令,写哪个都行,但为了代码可读性,大家习惯写 i++ 和 j--。另外,看到循环里直接写 i++ 就以为能跳过空格,其实这里只是单纯的反转,跟空格没关系,别被题目描述带偏了。

详细解析(节选)

这道题考查的是字符串反转函数的双指针写法。拿到题先看函数头,i 从 0 开始,j 从末尾开始,中间交换,那循环条件肯定是 i 小于 j,然后每次交换完 i 得往后挪、j 得往前挪,填 i++ 和 j-- 就对了。命题人喜欢在这种基础函数里挖坑,比如把 i 和 j 的顺序搞反,或者只写 i++ 忘了 j--,这样最后字符串会乱成一团。还有很多人会纠结要不要用 i++ 还是 ++i,其实编译器都优化成机器指令,写哪个都行,但为了代码可读性,大家习惯写 i++ 和 j--。另外,看到循环里直接写 i++ 就以为能跳过空格,其实这里只是单纯的反转,跟空格没关系,别被题目描述带偏了。从考频看,字符数组与字符串处理是高频考点,题库共考过 107 题,覆盖 10 个考试级别,2025 年考了 32 题,2024 年 10 题,2023 年 9 题,呈逐年上升趋势。前缀和与差分只考了 2 题,基本可以忽略。预测的话,未来可能会继续考字符串处理,尤其是反转、查找、统计这些基础操作,难度不会太大,但要注意细节,比如边界条件和循环终止条件。这道题的正确答案是:① i++ ② j-- ③ kz!=-1 ④ reverse(line)。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断