日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第二天2017/03/29: 字符串操作

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二天2017/03/29: 字符串操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、堆、棧的生長方向

【記憶知識】 棧的生長方向:開口向下(后定義的變量的內存地址更小) 堆的生長方向:開口向上(后分配內存的變量的內存地址更大) 【注意】堆、棧的生長方向和內存存放方向是兩個不同的概念,例如:分析a和b的地址大小(棧的生長方向)、a[0]和a[2]的地址的大小(內存存放方向)int a[10];int b[10]; 答:a的地址大于b的地址, 但是a[0]的地址小于a[2]的地址。

2、指針鐵律


C編譯器不允許這樣使用!


因為p指向字符串常量“abcdefg”,*p就表示字符串常量“abcdefg”,想用*p對常量“abcdefg”進行修改,肯定會報錯誤(即寫入位置發生沖突)
3、指針的相關知識

函數調用時,可以用n級指針改變n-1級指針的值。

==================================================================================

【字符串操作技巧】

while((*to++ = *from++) != ‘\0’) ; 字符串拷貝

strstr\strchr + while的用法

下面講解字符串的一些經典的相關操作

4、字符串拷貝

【注】此處不用額外寫上 *to = ‘\0’;

//上述代碼等價于:*to = *from;from++;to++;

5、siring字符串的相關函數操作【非常重要】

舉例:在長字符串中尋找一個短字符串出現的次數。(提示:用函數strstr)


6、兩頭堵

#include <iostream> using namespace std;int strlen_trimSpace1(char *p) //函數1 {//求出除去前后空格的字符串的長度int count = 0;int i = 0,j = 0;j = strlen(p)-1; //記得 -1(減1)while(isspace(p[i]) && p[i]!='\0') //從前往后{ //isspace(c)檢查參數c是否為空格字符i++;}while(isspace(p[j]) && j>0) //從后往前{j--;}count = j-i+1;memcpy(p,p+i,count);p[count] = '\0';cout<<p<<endl; //輸出修改后的結果preturn 0; } int strlen_trimSpace2(char *p,char *q) //函數2 {//求出除去前后空格的字符串的長度int count = 0;int i = 0,j = 0;j = strlen(p)-1; //記得 -1(減1)while(isspace(p[i]) && p[i]!='\0') //從前往后{ //isspace(c)檢查參數c是否為空格字符i++;}while(isspace(p[j]) && j>0) //從后往前{j--;}count = j-i+1;memcpy(q,p+i,count);q[count] = '\0';cout<<q<<endl; //為了不修改輸入的p字符數組,定義q作為接受數組return 0; } int main() {int ret = 0;//“兩頭堵”問題 //對于字符串分配內存有三種方式:堆、棧、全局區(常量區)char input[] = " abcd1111abcd2222abcd333abcd4 "; //除去前后兩頭空格剩下的字符串必須沒有空格char outstr[100] = " ";strlen_trimSpace1(input);//下面運行會崩潰,因為input1是常量,而在strlen_trimSpace函數中對input指向的常量字符串修改,會崩潰char *input1 = " abcd1111abcd2222abcd333abcd4 "; //strlen_trimSpace1(input1); strlen_trimSpace2(input1,outstr); if(ret!=0){cout<<"strlen_trimSpace Error!"<<endl;return 0;}getchar();return 0; }

7、字符串反轉

void reserve_str(char *str) {int i = 0,j = strlen(str)-1;char *h = str;char *r = str+j;char ch;while(h < r){ch = *h;*h = *r;*r = ch;h++;r--;}cout<<str<<endl; } int main() {//char *str = "ABCDEFGHIJKLMN"; //不能用字符串常量,因為不能修改char str[] = "ABCDEFGHIJKLMN";reserve_str(str);getchar(); }

8、字符串合并

char * s1_s2(char* s1,char* s2) {//char str[100]; //程序崩潰,因為str是棧中的局部變量,不能返回char *str = (char*)malloc(sizeof(char)*100); //正確做法:在堆中分配能返回的str指針char *s = str; //因為str經過兩個while循環后被修改,所以用s保存首地址(返回s即可)char *p1 = s1;char *p2 = s2;while(*str++ = *p1++);str--; //去掉'\0'字符while(*str++ = *p2++); return s; } int main() {char str1[] = "ABCD";char str2[] = "1234";char *out = s1_s2(str1,str2);cout<<out<<endl;//記得釋放在被調函數中分配的堆上的內存if(out!=NULL)free(out);getchar(); }

8、字符串中常見的錯誤

0-0)沒有給字符變量分配內存就開始使用它(使用方式:strcpy等) (0-1)越界 (0-2) (1)字符串和字符數組的區別:是不是帶有'\0'.(2)疑問:字符數組打印時為什么打印出“燙燙燙燙”?因為printf打印時,沒有'\0'結束符,因此打印出亂碼。strcpy等好多字符串操作函數遇見'\0'才結束! (3strlen是一個函數,它不包括'\0' sizeof是一個運算符,球數據實體的大小

(4)三種給字符串分配內存的內存四區圖(棧、堆、全局)

char str1[20] ; char *str2 = "AAAA"; char *str3 = (char*)malloc(100);

(5) [] 與 * 本質上是一樣的。

(6)在程序執行的時候,把字符串指針p的地址給修改了,但是沒有察覺,因此使對p進行理所應當的操作時,發生意料之外的結果。
例1:釋放a時為什么程序崩潰?

程序解讀:開始時a指向分配的字符串的頭地址,經過for循環后,a指向字符串末尾。
此時釋放a:free(a)是釋放了未知的地址,肯定會發生錯誤,程序崩潰。
【修改】應該講a指向分配的字符串的頭地址再進行釋放。

例2:為什么打印不出來to和from?

(7)再進行返回指向字符串的指針時,能否返回出來?

在全局區和堆區分配的可以返回 在棧上分配的不可以返回

總結

以上是生活随笔為你收集整理的第二天2017/03/29: 字符串操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。