目錄
1.什么是字符串
2.如何定義字符串?
第3和第4定義的區別:3是字符串變量,4是字符串常量,不予許被修改
3.strlen和sizeof的區別?
?4.地址分配(malloc,realloc,free,memset)
案例?
?5.字符串拷貝(strcpy,strncpy)?
5.1strcpy()
?5.2strncpy()
?6.字符串拼接(strcat)
7.字符串比較?(strcmp)
1.什么是字符串
由雙引號(Double Quote)引起來的一串字符稱為字符串字面值(String Literal),或者簡稱字符串,例如 “hello world”
注意:字符串結束的標志是一個 \0
在計算字符串長度的時候\0是結束標志,不算作字符串內容。
2.如何定義字符串?
1.int arr[]={1,2,3,4}; //整型數組2.char arr1[]={'h','e','l','l','o','\0'};
//定義字符串其實和定義整型數組很像,但是要以\0結尾3.char arr2[]={"hello world"}; //喜歡用這種和*p="hello world"這種4.char *p="hello world";
第3和第4定義的區別:3是字符串變量,4是字符串常量,不予許被修改
3.strlen和sizeof的區別?
在計算數據長度一般都用 sizeof 或者 strlen ,不過這兩還是有不小的區別的
1例
#include <stdio.h>
#include <string.h>
int main(){char arr[128]={"hello"};printf("sizeof :%d",sizeof(arr)); 這里的 sizeof 就是128了 sizeof 計算的整個數組的長度printf("strlen :%d",strlen(arr)); 這里的 strlen 就是5 strlen 計算的是有效的長度了,注意就好試完數組了就試下指針char *p="hello";printf("sizeof:char * %d",sizeof(char *));printf("sizeof:int * %d",sizeof(int *));printf("sizeof:p %d",sizeof(p));printf("strlen:p %d",strlen(p));1通過代碼可以知道,指針在這是占八位字節,且要用strlen才能算出指針中內容的大小}
代碼運行結果
?4.地址分配(malloc,realloc,free,memset)
malloc()函數原型 ?void *malloc(size_t size)
C 庫函數 void *malloc(size_t size) 分配所需的內存空間,并返回一個指向它的指針。
malloc在堆開辟空間,而普通變量在棧開辟空間,函數調用結束后就清理,回收空間,而堆要程序結束后才會釋放空間,所以malloc和free一般成對出現,主動釋放
realloc()函數原型 void *realloc(void *ptr, size_t size)
C 庫函數 void *realloc(void *ptr, size_t size) 嘗試重新調整之前調用 malloc 或 calloc 所分配的 ptr 所指向的內存塊的大小。?
free()函數原型 void free(void *ptr)
?釋放,防止內存泄露,防止懸掛指針
memset()函數原型 void *memset(void *str, int c, size_t n)
memset是一個初始化函數,作用是將某一塊內存中的全部設置為指定的值
memset函數在初始化處理時非常方便,但也有其局限性,比如要注意初始化數值,要注意字節數等等
int a[4]; memset(a,1,sizeof(a));
案例?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(){char *p;p=(char *)malloc(1);*p='s';printf("*p=%c\n",*p);free(p);//malloc在執行完后前一個malloc會懸掛起來,找不到了//malloc在堆開辟空間,而普通變量在棧開辟空間,函數調用結束后就清理,回收空間,而堆要程序結束后才會釋放空間p=(char *)malloc(12);memset(p,'\0',12);//將p全部清為\0int len=strlen("chenxinyu666");int Newlen=len-12+1; //將要擴容的大小realloc(p,Newlen); //將p進行擴容strcpy(p,"chenxinyu666");puts(p);puts("done");return 0;
}
?5.字符串拷貝(strcpy,strncpy)?
5.1strcpy()
函數原型:char *strcpy(char* dest, const char *src);
?參數1要被賦值的指針,參數2要給別人賦值的指針,并返回被復制后的后的dest
?5.2strncpy()
函數原型:char *strncpy(char *dest, const char *src, int n)
表示把src所指向的字符串中以src地址開始的前n個字節復制到dest所指的數組中,并返回被復制后的dest
?6.字符串拼接(strcat)
函數strcat()原型:char *strcat(char *dest, const char *src);
把src所指向的字符串(包括“\0”)復制到dest所指向的字符串后面(刪除*dest原來末尾的“\0”)。要保證*dest足夠長,以容納被復制進來的*src。*src中原有的字符不變。返回指向dest的指針。
7.字符串比較?(strcmp)
函數strcmp()原型:int strcmp(const char *s1,const char *s2);
若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數
函數strncmp()原型:int strncmp ( const char * str1, const char * str2, size_t n )
?功能是把 str1 和 str2 進行比較,最多比較前 n 個字節,若str1與str2的前n個字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 小于s2,則返回小于0的值。
8 如何快速查找需要的標準庫函數呢?
我的習慣是使用man函數手冊
格式:man strcpy?