字串與字元陣列
阿新 • • 發佈:2020-10-04
字串與字元陣列
-
字元陣列定義
char array[100];
-
字元陣列初始化
char array[100]={'a','b','c','d'}; char array[100]="abcd"; char array[100]={0}; char array[]="abcd";
-
隨機數產生函式rand與srand
-
標頭檔案stdlib.h
-
rand是偽隨機數產生器,每次呼叫rand產生的隨機數都是一樣的
-
如果呼叫rand之前先呼叫srand就出現任意的隨機數
-
只要能保證每次呼叫srand函式的時候,引數的值是不同的,那麼rand函式就一定會產生不同的隨機數
#include <time.h> int main(){ int t = (int)time(NULL); srand(t); for (int i = 0; i < 10; i++) { printf("%d\n", rand()); } }
-
-
用scanf輸入字串
#include <stdio.h> int main(){ char s[10]={0}; scanf("%s",s);//"%s"的作用就是輸入一個字串的,scanf是以回車鍵作為輸入完成標示的,但回車鍵本身並不會作為字串的一部分 //如果scanf引數中的陣列長度小於使用者在鍵盤輸入的長度,那麼scanf就會緩衝區溢位,導致程式崩潰 int i; for(i=0;i<10;i++){ printf("%d\n",s[i]); } printf("----------------------------------\n"); printf("%s\n", s); return 0; }
-
字串的結束標誌
scanf將回車,空格都認為是字串輸入結束標誌. -
字串處理函式
-
gets
#include <stdio.h> int main(){ char s[100]={0}; gets(s);//gets認為回車的輸入結束標示,空格不是輸入結束標示,所以用gets這個函式就可以實現輸入帶空格的字串 //gets和scanf一樣存在緩衝區溢位的問題 int i; for(i=0;i<10;i++){ printf("%d\n",s[i]); } printf("----------------\n"); printf("%s\n",s); } //gets不能用類似'%s'或者'%d'之類的字元轉義,只能接受字串的輸入
-
-
fgets函式
/*gets函式不檢查預留緩衝區是否能夠容納使用者實際輸入的資料。多出來的字元會導致記憶體溢位,fgets函式改進了這個問題。 由於fgets函式是為讀取檔案設計的,所以讀取鍵盤時沒有gets那麼方便*/ char s[100]={0}; fgets(s,sizeof(s),stdin);
stdin是標準輸入,一般指鍵盤輸入到緩衝區裡的東西。
-
puts
//puts函式列印字串,與printf不同,puts會在最後自動新增一個'\n' char s[]="老龍很帥,在座的各位都很醜!!!"; puts(s);
-
fputs函式
//fputs是puts的檔案操作版本 char s[]="老龍很帥,在座的各位都很醜!!!"; fputs(s,stdout); //stdout標準的輸出
-
strlen,字串長度
//size_t strlen(const char* _Str); 返回不包含字串結尾'\0'的字串長度 char s[100]="老龍很帥,在座的各位都很醜!!!"; int len=strlen(s);//得到字串長度,返回一個字串中有效字元的數量(不包含字串結尾的0) printf("%d\n",len);
//自定義strlen函式實現 int _strlen(const char* _str){ int len=0;//計算_str長度 if(_str!=NULL){ while((*_str++)!='\0') len++; } return len; }
-
strcat,字串追加
//size_t strcat(char* _str1,const char* _str2) 將引數_str2追加到_str1後尾 char s[128]="Hello World!"; int len=strlen(s);//計算s字串長度,返回一個字串中的有效字元數量(不包含字串結尾的0) printf("len=%d\n",len); char s1[100]="abc123321"; strcar(s,s1);//將兩個字串合併,結果放入第一個引數裡面,strcat也存在緩衝區溢位的問題 printf("%s\n", s);
//自定義strcat函式實現 void _strcat(char* _str1,const char* _str2){ if(_str1!=NULL&&_str2!=NULL){ while(*_str1!='\0') _str1++; //迴圈至str1字串末尾 while(*_str2!='\0') *_str1++=*_str2++; //把字串_str2裡面的內容儲存至_str1中 *_str1='\0';//結尾str1賦值'\0'表示字串結束 } }
-
strncat,字串有限追加
//size_t strncat(char* _str1,const char* _str2,size_t len) char s[128] = "老龍很帥"; char s1[50] = ",在座的各位都很醜!!!"; strncat(s, s1, 5); printf("%s\n", s);
//自定義strncat函式實現 void _strncat(char* _str1, const char* _str2, size_t len){ if (_str1 != NULL&&_str2 != NULL){ while (*_str1 != '\0')_str1++; for (int i = 0; i < len; i++){ *_str1++ = *_str2++; } } }
-
strcmp,字串比較
//int strcmp(const char* _str1,const char* _str2); //比較兩個字串是否相等,相等返回0,不等返回非0 char s[128] = "aabc"; //>大於-1 等於0 小於1 char s1[50] = "aabcs"; printf("%d\n", strcmp(s, s1));
//自定義strcmp函式實現 int _strcmp(const char* str1,const char* str2){ int ret = 0; if (str1 != NULL&&str2 != NULL){ while (!(ret = *str1 - *str2) && *str1){ str1++; str2++; } } if (ret > 0) return 1; else if (ret < 0) return -1; return 0; }
-
strncmp,字串有限比較
int strcmp(const char* _str1,const char* _str2,size_t len);
-
strcpy字串拷貝
char *strcpy(char * _Str1, const char * _Str2); //將引數_Str2拷貝到引數_Str1中
//自定義strcpy函式實現 void _strcpy(char* _str1,const char* _str2){ if(_str1!=NULL&&_str2!=NULL){ while((*_str1++=*_str2++)!='\0') } }
-
strncpy字串有限拷貝
-
sprintf,格式化字串
和printf函式功能類似,printf函式將格式化結果輸出到螢幕,sprintf將格式化結果輸出到字串 -
sscanf函式
sscanf類似於scanf函式,,scanf從鍵盤讀取使用者輸入,scanf從指定格式化字串讀取輸入char s[128] = "10 0x10 aabc"; int x,y; char b[100]; sscanf(s, "%d %X %[a-z]", &x,&y,b); printf("%d\n",x); printf("%x\n", y); printf("%s\n",b);
-
strchr查詢字元
char * strchr(char * _Str, int _Ch); //在引數_str中查詢引數_Ch指定字元,找到返回字元_Ch在_Str中所在位置,沒有找到返回NULL;
//自定義strchr函式實現 char *strchr(const char* _str1,int ch){ if (str1 != NULL){ while (*_str1++ != '\0'){ if (*_str1 == ch){ return (char*)_str1; } } } return NULL; }
-
strstr
char* strstr(char* _str,const char* _substr) //在引數_str中查詢引數_substr指定子串,找到返回子串在_str中所在位置,沒有找到返回NULL
//自定義strstr函式實現 char* _strstr(char* _str, const char* _substr){ if (_str != NULL&&_substr != NULL){ int lenstr = strlen(_str); int lensub = strlen(_substr); if (lenstr < lensub) return NULL; int i, j; for (i = 0; i < lenstr - lensub; i++){ for (j = 0; j < lensub; j++){ if (_str[i + j] != _substr[j]) break; } if (j == lensub) return &_str[i]; } } return NULL; }
-
strtok分割字串
//字元在第一次呼叫時strtok()必需給予引數s字串,往後的呼叫則將引數s設定成NULL每次呼叫成功則返回指向被分割出片段的指標 char buf[] = "abc@defg@igk"; char *p = strtok(buf, "@"); while (p) { printf("%s\n", p); p = strtok(NULL, "@"); }
-
atoi轉化為int atof轉化為float atol轉化為long
需要包含標頭檔案stdlib.h