字符串專題

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

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|

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


發佈了34 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章