您的位置:首页 > 其它

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

2014-08-24 10:28 225 查看
题目很水,我想代码应该就是最好的注释,实现如下:

/*************************************************************************
> 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
;
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';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: