《C和指针》第4章编程练习第7题

《C和指针》第4章编程练习第7题的题目如下:

编写一个函数,从一个字符串中去除多余的空格。函数的原型应该如下:

void deblank( char string[] );

当函数发现字符串中如果有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。注意当你遍历整个字符串时要确保它以NUL字符结尾。


说实话,做这道题让我想了很久。昨天终于写出来了。代码如下:

#include <stdio.h>
#include <stdlib.h>
 
#define NUL '\0'
#define EMPTY ' '
 
void deblank(char  string[]) {
    char *oldpstr = string, *newpstr = string;
    int offset_begin = 0, offset_end = 0, start = 0, i;
    // copy first empty char
    if(*oldpstr == EMPTY) {
        newpstr++;
    }
    
    // copy middle char
    while(*oldpstr != NUL) {
        if(*oldpstr != EMPTY) {
            if(start)
                offset_end = oldpstr - string;
            else {
                offset_begin = offset_end = oldpstr - string;
                start = 1;
            }
        } else {
            if(start) {
                // when not first char, cat empty
                if(newpstr - string) {
                    *newpstr = EMPTY;
                    newpstr++;
                }
                
                // copy substring to newpstr
                for (i = 0; i < (offset_end - offset_begin + 1); i++) {
                    *(newpstr+i) = *(string+offset_begin+i);
                }
                newpstr += (offset_end - offset_begin + 1);
                // reset offset 0
                offset_begin = 0;
                offset_end = 0;
                 
                // reset start    
                start = 0;
            }
        }
        oldpstr++;
    }
    
    if(start) {
        // when not first char, cat empty
        if(newpstr - string) {
            *newpstr = EMPTY;
            newpstr++;
        }
        
        // copy substring to newpstr
        for (i = 0; i < (offset_end - offset_begin + 1); i++) {
            *(newpstr+i) = *(string+offset_begin+i);
        }
        newpstr += (offset_end - offset_begin + 1);
        // reset offset 0
        offset_begin = 0;
        offset_end = 0;
         
        // reset start    
        start = 0;
    }
    
    // set NUL
    *newpstr = NUL;
}
 
int main()
{
    char str[50], msg[]={"Input a string:"};
    puts(msg);
    gets(str);
    deblank(str);
    printf("%s\n", str);
    getch();
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值