字符串专题

来源:互联网 发布:光环国际教育 大数据 编辑:程序博客网 时间:2024/06/05 17:15

********************

char *filename="asdP/asdf/jjjj/uu";

char *p = NULL;

p = strchr(filename, '/');//在filename中匹配'/'返回首次匹配到的地址

if(p != NULL) *p = '_';

运行结果:Segmentation fault

原因:“asdP/asdf/jjjj/uu”是常量值,所以不可以修改,因此也可以看出,如果采用这种字符串赋值方法,必须用const char *filename="asdP/asdf/jjjj/uu";

纠正:char filename[]="asdP/asdf/jjjj/uu";

************************

技巧性用法:

char *s = NULL;

while(   (s=strchr(filename, '/'))   !=NULL   )

*s='_';  

std::cout<<filename<<endl;

运行结果:asdP_asdf_jjjj_uu

执行过程:s=NULL, while 1次s=/asdf/jjjj/uu, while 2次s=/jjjj/uu, while 3次s=/uu。对于一个字符串,指针指向其中一个字符时候不单是指这一个字符,而是从这个

字符开始一直到\0位置。

追加:输出s的话就是该指针后面到\0的字符串,但是如果输出*s的话,只输出当前指针所指向的字符

****************************

字符指针引用的错误用法

bool find(char*& ptr);

char array[]="  n iha o";//一共10个字符,加上\0

bool result = find(array);//报错char*&和char*不匹配

运行结果:error: invalid initialization of non-const reference of type ‘char*&’ from a temporary of type ‘char*’

原因:array虽然可以退变为指针,但是它是暂时的,实际还是array[10],所以不能匹配char*&

纠正:char *p=array;   bool result = find(p);

*******************************

数组名不可以当成变量自加自减运算

char ite[1024];     //会出错,应该是char ite[1024]={'\0'};    char *s = ite;

const char * p="nihao";

while(*p!='\0')

{

*ite=*p;

ite++;

p++;

}

运行结果:error: invalid lvalue in assignment

原因:数组名不是变量,不可以作为左值,lvalue是左值的意思

纠正:重新申请一个变量指向数组,然后用该变量进行自增等其他运算

提升:while循环内部可以改成   *s++=*p;   (*s++相当于,先取s,然后*s,然后s++)

************************************

从文件中按行读取字符串

vector<char *> files; //文件名都存在这个vector中

vector<char *> filecontent; //读入的所有文件每一行的内容

FILE *inflie;

char buf[1024];

for(int i = 0; i<files.size(); i++) 

{

infile = fopen(files[i], "r");

if(infile)

{

while(fgets(buf, 1024, infile)!=NULL)    //循环读入一个文件的每一行内容

{

//处理读入一行的内容

int j=1;

while(buf[j]!='\0' && buf[j]!='\n') j++;  //去掉回车'\n'  ----stage1

buf[j]='\0';

j=0;

while(buf[j]!='\0'&&isspace(buf[j])) j++; //去掉每行前面的空格     -------stage2

if(buf[j] == '#' || buf[j]=='\0') continue; //最终获得的字符串,如果以#开头或者没有内容则舍弃掉这一行

filecontent.push_back(strdup(&buf[j])); //从前面可知,&buf[j]表示指针,又因为是字符串,所以指的是该指针后面所有的字符串

}

fclose(infile);

}

}

文件中:|         VB_CV    54  L _BB\n|

stage1:   |         VB_CV    54  L _BB\0|

stage2:   |VB_CV    54  L _BB\0|

************************************************


0 0
原创粉丝点击