C/C++消除字符串中的无效字符,用于加载配置

来源:互联网 发布:佛教源码 编辑:程序博客网 时间:2024/05/20 17:28

字符数组是一个数组,每个元素的值都可以改变。而字符串指针指向的是一个常量字符串,它被存放在程序的静态数据区,一旦定义就不能改变。这是最重要的区别。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>// 考虑了右边有空格的情况,但是没有考虑左边有空格的情况void trim_space(char* str){    if(!str)        return;    char* ptr=str;    int len=strlen(ptr);    while(len-1>0 && isspace(ptr[len-1]))        ptr[--len]=0;    while(*ptr && isspace(*ptr))    {        ++ptr;        --len;    }    memmove(str,ptr,len+1);}void trim(char* str){    char* start=str;    char*end;    int len=strlen(str);    end=str+len-1;    while(1)    {        char c = *start;        if(!isspace(c))            break;        start++;        if(start>end)        {            str[0]=0;            return;        }       }    while(1)    {        char c=*end;        if(!isspace(c))        {            break;        }        end--;        if(start>end)        {            str[0]=0;            return;        }    }    memmove(str,start,end-start+1);    str[end-start+1]='\0';}int main(){    char testStr[]="    trim this  ";      //此处必须使用字符数组//  char* pTestStr=&testStr[0];    trim_space(testStr);    puts(testStr);    return 0;}void trim1(char * str, char* sp, char c){c=' ';char * sp=str;while(*str){if(*str!=c){*sp=*str;sp++;}str++;}sp='\0';}void trim2(string& str,string& del,string::size_type pos=0){pos=str.find_first_of(del,pos);if(pos=string::npos)return ;trim2(str.erase(pos,1),del);}/* c language*/int is_ws(char c){return c==' ';}int trim_3(const char* src, char ** dst){if(strlen(src)==0)return 0;int src_len=strlen(src);int lp=0;   /* left padding */int rp=0;  /* right padding */while(is_ws(src[lp])&&++lp);while(is_ws(src[src_len-rp-1])&&++rp);if(lp+rp!=0){(*dst)=(char*)realloc((*dst),sizeof(char)*src_len-lp-rp);}int i;for(i=lp;i<src_len-lp;i++)(*dst)[i-lp]=src[i];(*dst)[src_len-lp-rp]='\0';return (lp+rp);}static bool readConfigFile(const char* filePath,const string& key,string& value){   fstream cfgFile;   //打开文件   cfgFile.open(filePath);   if(cfgFile.is_open())   {  cout<<"cant not open file\n";  return false;   }   char temp[1000];          //此处必须是字符数组   while(!cfgFile.eof())   {  cfgFile.getline(temp,1000);  string line(temp);  trim2(line," ");  size_t pos=line.find('=');  if(pos==string::npos)  return false;  string strkey=line.substr(0,pos);   //获取的key 和value还需要trim  if(strkey==key)  {  value=line.substr(pos+1);  return true;  }   }   return false;}