********************
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|
************************************************