首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

处置空格的就地字符串处理函数的实现

2012-09-11 
处理空格的就地字符串处理函数的实现处理空格的就地字符串处理函数的实现by 沈东良http://blog.csdn.net/s

处理空格的就地字符串处理函数的实现

                                处理空格的就地字符串处理函数的实现


                                                                                                                                                                        by 沈东良 http://blog.csdn.net/shendl

          本文介绍处理空格的就地字符串处理函数的实现。就是在字符串内存内进行的字符串操作。不涉及到分配新的内存。

int tripTail(char*str) {

inti = 0;

for(; str[i] != '\0';i++) {


}

intend = i;

printf("endis %d\n", end);

//i==str[end]

for(i--; str[i] == ' ';i--) {


}

//firstnon space

str[++i]= '\0';

printf("endis %d,%d\n", i, strlen(str));


puts(str);

printf("%d\n",strlen(str));

}

            去掉字符串尾部的空格是最简单的。因为字符串是以'\0'表示字符串的终止的。因此,只需要把尾部的第一个空格找到,然后设置为‘\0’就可以了。



int tripHead(char*str) {


intnewStrNextIndex = 0;

inti = 0;

if(str[0] == ' '){


for(i = 1; str[i] == ' ';i++) {

printf("Ignorespace,str[%d]:%c\n",i, str[i]);

}

for(; str[i] != '\0';i++) {

if(newStrNextIndex!=i){

str[newStrNextIndex]= str[i];

}

newStrNextIndex++;

}


}

str[newStrNextIndex]= '\0';

puts(str);

return0;

}


         把字符串头部的空格去掉,需要移动后面每一个字符串。这个新的字符串的大小<=原来的字符串。因此可以寄生在原来的字符串的内存空间中。

     newStrNextIndex表示新字符串的尾部。它的头部是0。这样就可以把头部的空格都去除了。并且在O(n)算法复杂度内解决这个问题。



int exactMoreSpace(char* str) {

inti = 0;

intnewStrNextIndex = 0;


for(i = 0; str[i] != '\0';i++) {

if(str[i] == ' '){


if(newStrNextIndex!=i){

str[newStrNextIndex]= str[i];

}

newStrNextIndex++;

printf("firstspace,str[%d]:%c\n",i, str[i]);

for(i++; str[i] == ' ';i++) {

printf("Ignorespace,str[%d]:%c\n",i, str[i]);

}

i--;


}else{

if(newStrNextIndex!=i){

str[newStrNextIndex]= str[i];

}

newStrNextIndex++;


}


}

str[newStrNextIndex]= '\0';

printf("%s\n",str);

return0;


}


      把字符串中的连续空格合并为一个空格,需要创建一个新的字符串。这个新的字符串的大小<=原来的字符串。因此也可以寄生在原来的字符串的内存空间中。

   newStrNextIndex表示新字符串的尾部。它的头部是0。当遇到空格,就在新字符串写入这个空格,并且扫描掉紧根在后面的空格。在O(n)算法复杂度内解决这个问题。





小结

         这几个函数是就地字符串处理函数,节约了内存空间。

        要注意,C中的常量字符串在常量区分配,该内存区域是只读的,如果试图修改该内存区域的数据,会引发段错误,进程崩溃。因此,它们的参数不能是常量字符串。

        这些函数的核心算法思想是,构建一个新的字符串,这个字符串寄生在原来的字符串的内存空间中。

         只要有了“构建新的字符串”的思路,就能够很容易地理解上述函数实现。




热点排行