去除字符串中单词的多余空格

题目很水,我想代码应该就是最好的注释,实现如下:

/*************************************************************************
    > File Name: trim_space.c
    > Author: KrisChou
    > Mail:zhoujx0219@163.com 
    > Created Time: Sun 24 Aug 2014 10:03:33 AM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 128

static int my_isspace(char c)
{
    if(c == ' ' || c == '\n' || c == '\t' || c == '\v')
        return 1;
    else
        return 0;
}

static void trim_space(char *line)
{
    int pre, work_index;
    pre = -1;
    work_index = 0;
    while(line[work_index] != '\0')
    {
        if(!my_isspace(line[work_index]))
        {
            line[++pre] = line[work_index++];
        }else if(pre != -1 && !my_isspace(line[pre]))
        {
            line[++pre] = line[work_index++];
        }else
        {
            work_index++;
        }
    }
    line[++pre] = '\0';
}

int main(int argc, char *argv[])
{
    char line[N];
    memset(line,0,N);
    while(fflush(stdin),gets(line)!= NULL)
    {
        trim_space(line);
        puts(line);
    }
    return 0;
}

/* 关于输入输出的问题此处再强调一次,gets不会存储‘\n’,并将最后一个‘\n’换成‘\0’存储。
 * puts会将‘\0’变成‘\n’输出。
 * gets是一个不安全函数,会输出直至遇到‘\0’为止。
 * fgets会存储‘\n’,fputs输出时不会将‘\0’变成‘\n’                                    */

注意

由于有人反应不理解,此处再解释下。实际上此去空格方法与快速排序的partition步骤类似。也运用了快慢指针。其中快指针用于遍历数列。将trim_space中的while循环写成以下形式,可能大家就能理解了。如下:

static void trim_space(char *line)
{
    int pre = -1;
    int work_index = 0;
    while( line[work_index] != '\0')
    {
        if(!my_isspace(line[work_index]))
        {
            line[++pre] = line[work_index++];
        }else
        {
            if(pre == -1 || my_isspace(line[pre]))
            {
                work_index++;
            }else
            {
                line[++pre] = line[work_index++];
            }
        }
    }
    line[++pre] = '\0';
}
posted @ 2014-08-24 10:28  Acjx  阅读(906)  评论(0编辑  收藏  举报