《C和指针》第4章编程练习第7题的题目如下:
编写一个函数,从一个字符串中去除多余的空格。函数的原型应该如下:
void deblank( char string[] );
当函数发现字符串中如果有一个地方由一个或多个连续的空格组成,就把它们改成单个空格字符。注意当你遍历整个字符串时要确保它以NUL字符结尾。
说实话,做这道题让我想了很久。昨天终于写出来了。代码如下:
#include <stdio.h>
#include <stdlib.h>
#define NUL '\0'
#define EMPTY ' '
void deblank(char string[]) {
char *oldpstr = string, *newpstr = string;
int offset_begin = 0, offset_end = 0, start = 0, i;
// copy first empty char
if(*oldpstr == EMPTY) {
newpstr++;
}
// copy middle char
while(*oldpstr != NUL) {
if(*oldpstr != EMPTY) {
if(start)
offset_end = oldpstr - string;
else {
offset_begin = offset_end = oldpstr - string;
start = 1;
}
} else {
if(start) {
// when not first char, cat empty
if(newpstr - string) {
*newpstr = EMPTY;
newpstr++;
}
// copy substring to newpstr
for (i = 0; i < (offset_end - offset_begin + 1); i++) {
*(newpstr+i) = *(string+offset_begin+i);
}
newpstr += (offset_end - offset_begin + 1);
// reset offset 0
offset_begin = 0;
offset_end = 0;
// reset start
start = 0;
}
}
oldpstr++;
}
if(start) {
// when not first char, cat empty
if(newpstr - string) {
*newpstr = EMPTY;
newpstr++;
}
// copy substring to newpstr
for (i = 0; i < (offset_end - offset_begin + 1); i++) {
*(newpstr+i) = *(string+offset_begin+i);
}
newpstr += (offset_end - offset_begin + 1);
// reset offset 0
offset_begin = 0;
offset_end = 0;
// reset start
start = 0;
}
// set NUL
*newpstr = NUL;
}
int main()
{
char str[50], msg[]={"Input a string:"};
puts(msg);
gets(str);
deblank(str);
printf("%s\n", str);
getch();
return 0;
}