去除字符串中单词的多余空格
题目很水,我想代码应该就是最好的注释,实现如下:
/************************************************************************* > 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'; }