编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
答案:
#include <stdio.h>
#define NONBLANK 'a' // 这里定义一个非空格字符
int main()
{
int c, c_last = NONBLANK;
while ((c = getchar()) != EOF)
{
if (c != ' ')
{ // 如果当前字符不是空格,直接输出
putchar(c);
}
else if (c_last != ' ')
{ // 如果当前是空格,且前一个字符不是空格,输出空格
putchar(c);
}
c_last = c; // 更新上一个字符为当前字符
}
return 0;
}
程序说明:
-
变量初始化:
c_last
被初始化为'a'
(非空格字符),用于记录上一个读取的字符。c
用于存储当前读取的字符。
-
字符读取:
- 程序通过
getchar()
函数逐个读取字符直到遇到EOF
(文件结束符)。
- 程序通过
-
空格处理:
- 如果当前字符不是空格 (
c != ' '
),直接输出。 - 如果当前字符是空格 (
c == ' '
),并且上一个字符c_last
不是空格,那么就输出当前空格。这样可以确保只有连续的空格被合并为一个空格。
- 如果当前字符不是空格 (
-
更新
c_last
:- 每次读取字符后,更新
c_last
为当前字符,确保下次判断时有正确的前一个字符。
- 每次读取字符后,更新
或者还有一种更简洁的写法:
#include <stdio.h>
#define NONBLANK 'a' // 这里定义一个非空格字符
int main()
{
int c, c_last = NONBLANK; // 初始化上一个字符为非空格
while ((c = getchar()) != EOF)
{
// 如果当前字符不是空格,或者前一个字符不是空格,输出当前字符
if (c != ' ' || c_last != ' ')
{
putchar(c);
}
c_last = c; // 更新上一个字符为当前字符
}
return 0;
}
程序说明:
-
宏定义:
#define NONBLANK 'a'
用来定义一个非空格字符,这里初始化了c_last
变量为'a'
。这样在开始时,c_last
不会是空格,从而保证程序在开始时能正常工作。 -
字符读取:通过
getchar()
逐个读取输入字符直到EOF
(文件结束符)。 -
判断空格处理:
if (c != ' ' || c_last != ' ')
这行代码的意思是:如果当前字符不是空格(c != ' '
),或者当前字符是空格但前一个字符不是空格(c_last != ' '
),那么就输出当前字符。- 这样就能保证连续的空格只会输出一个空格。
-
更新
c_last
:每读取一个字符后,更新c_last
为当前字符,以便下次判断时可以跟踪前一个字符。