下面的代码将使用两种方法删除字符串中的多余空格,如果两个字符之间的空格数目大于 1,那么只保留一个空格,否则不做处理。
由这个例子可以联想到代码的压缩,删除空格是压缩代码的第一步。
- #include <stdio.h>
- #define MAXBUFF 128
- int getline(char line[], int nmax);
- int compact1(char line[]);
- int compact2(char line[]);
- int main(void) {
- char buffer1[MAXBUFF];
- char buffer2[MAXBUFF];
- int len;
- len = getline(buffer1, MAXBUFF);
- printf("You entered : %s\n", buffer1);
- strcpy(buffer2,buffer1);
- printf("Which is : %s\n", buffer2);
- len=compact1(buffer1);
- printf("compact1: len=%d, %s\n",len, buffer1);
- len=compact2(buffer2);
- printf("compact2: len=%d, %s\n",len, buffer2);
- }
- // 输入一行最大长度为 nmax 的字符串,并返回其长度
- int getline(char line[], int nmax)
- {
- int len;
- char c;
- len = 0;
- printf("Enter a string [CR to exit]: ");
- while(((c=getchar())!='\n') && len<nmax-1)
- line[len++]=c;
- line[len]='\0';
- return len;
- }
- // 将多个连续空格替换为一个空格,并返回替换后的字符串的长度
- int compact1(char line[])
- {
- int cursor=0; // 即字符数组的当前下标
- int prevspace = 0; // 如果上一个位置是字符串则返回true
- int lcv=0;
- if(line[cursor]=='\0')
- return 0;
- do{
- if((line[cursor]==' ')&&prevspace){
- // 如果一个空格前面还有一个空格,那么将后面的字符串左移一个位置
- for(lcv=cursor;line[lcv];lcv++)
- line[lcv]=line[lcv+1];
- }else
- prevspace=(line[cursor++]==' ');
- }while(line[cursor]);
- return cursor;
- }
- // 将多个连续空格替换为一个空格,并返回替换后的字符串的长度
- int compact2(char line[])
- {
- int cursor=0; // 字符数组的当前下标
- int prevspace = 0; // 如果上一个位置是字符串则返回true
- int lcv = 0; // 将字符串复制到哪个位置
- do{
- if(!((line[cursor]==' ')&&prevspace)){
- line[lcv++]=line[cursor];
- prevspace=(line[cursor]==' ');
- }
- }while(line[cursor++]);
- return(lcv-1); // 遇到 '\0' 返回 -1
- }
可能的输出结果: