下面的代码将使用两种方法删除字符串中的多余空格,如果两个字符之间的空格数目大于 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
}
可能的输出结果: