去除字符串中多余的空格 C语言实现

来源:互联网 发布:知敬畏 编辑:程序博客网 时间:2024/05/10 06:30

比如“hello        world       hey     baby”

变成“hello world hey baby”


思想是设置两个指针,前面的(front)一直往前走直到字符串结尾,后面的(last)复制front当前指向的字符,

当遇到多个空格时并不复制,而是等到front指向非空格字符时在往前走。


#include <stdio.h>

#include <stdlib.h>
#include <string.h>


void omitSpace(char *str){
char *front = str;
char *last = str;
if(str == NULL) return;
while((*front) == ' ') {++front;}            //omit space in the beginning
while((*front) != '\0'){
if((*front) == ' '){
*last = ' ';
while((*front) == ' '){
++front;
}
}else{
*last = *front;                 //can also add one if condition to avoid unnecessary assignment: if(last != front){*last = *front;}
++front;
}
++last;            //front has pointed to the next char, so don't ++front;
}
*last = '\0';
}


int main(){
char *cases[] = {"hello   world!!!", " hello world...", "  Hello  world???", "he   llo wor   ld   ...  "};
char **str;
int strIndex = 0;
int letterIndex = 0;
int casesNum = sizeof(cases) / sizeof(char*);                  //don't forget to be divided by sizeof(char*).
str = (char**)malloc(sizeof(cases));
for(strIndex = 0; strIndex < casesNum; ++strIndex){
str[strIndex] = (char*)malloc(1 + strlen(cases[strIndex]));
for (letterIndex = 0; letterIndex < strlen(cases[strIndex]); ++letterIndex)
{
str[strIndex][letterIndex] = cases[strIndex][letterIndex];
}
str[strIndex][letterIndex] = '\0';
}
for(strIndex = 0; strIndex < casesNum; ++strIndex){
printf("%s\n", str[strIndex]);
omitSpace(str[strIndex]);
printf("%s\n", str[strIndex]);
}
for(strIndex = 0; strIndex < casesNum; ++strIndex){
free(str[strIndex]);
}
free(str);
return 0;
}