第二天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、指針的相關知識
==================================================================================
【字符串操作技巧】
while((*to++ = *from++) != ‘\0’) ; 字符串拷貝
strstr\strchr + while的用法
下面講解字符串的一些經典的相關操作
4、字符串拷貝
【注】此處不用額外寫上 *to = ‘\0’;
5、siring字符串的相關函數操作【非常重要】
舉例:在長字符串中尋找一個短字符串出現的次數。(提示:用函數strstr)
6、兩頭堵
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'才結束! (3) strlen是一個函數,它不包括'\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: 字符串操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一天2017/03/28
- 下一篇: 第三天2017/03/30(下午:二级指