C语言习题(删除多余空格)*

编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。

答案:

#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;
}

程序说明:

  1. 变量初始化

    • c_last 被初始化为 'a'(非空格字符),用于记录上一个读取的字符。
    • c 用于存储当前读取的字符。
  2. 字符读取

    • 程序通过 getchar() 函数逐个读取字符直到遇到 EOF(文件结束符)。
  3. 空格处理

    • 如果当前字符不是空格 (c != ' '),直接输出。
    • 如果当前字符是空格 (c == ' '),并且上一个字符 c_last 不是空格,那么就输出当前空格。这样可以确保只有连续的空格被合并为一个空格。
  4. 更新 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;
}

程序说明:

  1. 宏定义#define NONBLANK 'a' 用来定义一个非空格字符,这里初始化了 c_last 变量为 'a'。这样在开始时,c_last 不会是空格,从而保证程序在开始时能正常工作。

  2. 字符读取:通过 getchar() 逐个读取输入字符直到 EOF(文件结束符)。

  3. 判断空格处理

    • if (c != ' ' || c_last != ' ') 这行代码的意思是:如果当前字符不是空格(c != ' '),或者当前字符是空格但前一个字符不是空格(c_last != ' '),那么就输出当前字符。
    • 这样就能保证连续的空格只会输出一个空格。
  4. 更新 c_last:每读取一个字符后,更新 c_last 为当前字符,以便下次判断时可以跟踪前一个字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有名字的鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值