C語言字串詳解
阿新 • • 發佈:2019-01-29
1.1 字元陣列定義
char array[100] //定義一個長一百位元組長度的字串
1.2 字元陣列初始化
char array[100] = { 'a','b','c' };//初始化 array 此時array = "abc"
char array[100] = { 'a','b',0,'c' };//初始化array 此時array = "ab" ,字串都是以0結尾,讀到0就結束了
char array[100] = "abc";//同char array[100] = { 'a','b','c' }
char array[100] = {0};//初始化一個空字串,
1.3 字元陣列使用
1.5 字串的輸入與輸出 1 用scanf/printf輸入輸出字串 char s[100]; printf("請輸入一個字串:"); scanf("%s", s); //輸入字串不能超過字串定義的長度,不然程式會崩潰 printf("%s", s); //列印字串 注:scanf回車或空格做為字串結束標識 輸出"hello world"只會打印出hello(到空格就結束了) 2 用gets/puts函式輸入輸出 用法:
注: 1 gets() 只把回車當結束標識,不會把空格當成結束標識, scanf 兩個都當成結束標識 2 gets() 與 scanf()都會出現快取溢位問題 ; 3 gets() 只能把輸入物件 的當字串處理 ,scanf() 可以通過 %c,%d 等來將輸入物件轉義 可以用atoi() 將輸入的物件強制轉換成你int 型別 4 puts 輸出完後會直接換行 3 fgets()函式 用法:
注:1 fgets()函式:從標準輸入中取出前N個位元組放入字元陣列中 2 fgets() 是安全的,gets() ,scanf() 都會出現快取溢位問題 3 其它與gets()用法類似 1.6 其它字串函式<所在標頭檔案string.h> 1.6.1 strlen:返回有效字串長度,不包含結尾的0 用法: size_t strcat(char * _Str1,constchar * _Str2); 程式碼: int slen = strlen("hello,world") ; 1.6.2 strncat,strcat字串有限追加 size_t strncat(char * _Str1,constchar * _Str2, size_t len); 程式碼: char s1[100] = "hello"; char s2[200] = "world"; strncat(s1,s2);// s1 變成helloworld 注:strcat當兩個拼接之和長度大於[100] 會快取溢位,導致程式崩潰 strncat:會丟掉溢位的部分,並不他報錯,但會損失精度 1.6.3 strcmp,strncmp,字串比較 int strcmp(constchar * _Str1,constchar * _Str2); 比較兩個字串是否相等,相等返回0,不等返回非0 int strcmp(constchar * _Str1,constchar * _Str2,n); 比較兩個字串的前N個字元是否相等,相等返回0,不等返回非0 程式碼:
列印結果: 不相同 相同 1.7.10strcpy,strncpy字串拷貝 char *strcpy(char * _Str1,constchar * _Str2); char *strncpy(char * _Str1,constchar * _Str2,N); 將引數_Str2拷貝到引數_Str1中 將引數_Str2的前N個字元拷貝到引數_Str1中 程式碼:
1.7.12sprintf,格式化字串 和printf函式功能類似,printf函式將格式化結果輸出到螢幕,sprintf將格式化結果輸出到字串 程式碼:
1.7.13Sscanf函式 Sscanf類似於scanf函式,,scanf從鍵盤讀取使用者輸入,scanf從指定格式化字串讀取輸入 程式碼: int a = 0; sscanf(s,"輸入一個數字:%d",&a);//將引號內容及標準輸入放到s中 1.7.14strchr查詢字元 char * strchr(char *_Str,int_Ch); 在引數_str中查詢引數_Ch指定字元,找到返回字元_Ch在_Str中所在位置,沒有找到返回NULL; 程式碼: char *buf = strchr( "hello",'h'); //檢視前面字串“hello”中是否有'h' 字元,; 1.7.15strstr查詢子串 char * strstr(char *_Str,constchar *_SubStr) 在引數_str中查詢引數_SubStr指定子串,找到返回子串在_Str中所在位置,沒有找到返回NULL; 程式碼: char *buf = strchr( "helloworld",'hello'); //檢視前面字串“helloworld”中是否有'hello' 字元,; 1.7.16strtok分割字串 字元在第一次呼叫時strtok()必需給予引數s字串,往後的呼叫則將引數s設定成NULL每次呼叫成功則返回指向被分割出片段的指標 程式碼:
1.7.17atoi轉化為int,float,long 需要包含標頭檔案stdlib.h 直接將你字串型別的”200“ 轉換成 int 型別的200 程式碼:
1.4 隨機數產生函式rand與srand 標頭檔案stdlib.h Rand是偽隨機數產生器,每次呼叫rand產生的隨機數是一樣的 如果呼叫rand之前先呼叫srand就出現任意的隨機數 只要能保證每次呼叫srand函式的時候,引數的值是不同的,那麼rand函式就一定會產生不同的隨機數#include <stdio.h> int main01()//漢字字串逆置 { char buf[100] = "你好世界";//GBK編碼的漢字一個漢字兩個字元 //char buf[100] = "你好"; int len = 0; while (buf[len++]);//求字元的串的長度 len--; //printf("%d\n", len); int min = 0; int max = len - 1; while (min < max) { // 前後兩個字元交叉交換字元 char tmp = buf[min]; buf[min] = buf[max - 1]; buf[max - 1] = tmp; tmp = buf[min + 1]; buf[min + 1] = buf[max]; buf[max] = tmp; min += 2;//每次跳兩個字元 max -= 2; } printf("%s\n", buf); return 0; } int count() //求字串的字元個數,一個漢字算一個字元 { char buf[100] = "你好abc"; int len = 0; int i = 0; while (buf[i]) { if (buf[i] < 0) i++; i++; len++; } //len--; return len; } #include <stdio.h> int main01()//漢字字串逆置 { char buf[100] = "你好世界";//GBK編碼的漢字一個漢字兩個字元 //char buf[100] = "你好"; int len = 0; while (buf[len++]);//求字元的串的長度 len--; //printf("%d\n", len); int min = 0; int max = len - 1; while (min < max) { // 前後兩個字元交叉交換字元 char tmp = buf[min]; buf[min] = buf[max - 1]; buf[max - 1] = tmp; tmp = buf[min + 1]; buf[min + 1] = buf[max]; buf[max] = tmp; min += 2;//每次跳兩個字元 max -= 2; } printf("%s\n", buf); return 0; } int count() //求字串的字元個數,一個漢字算一個字元 { char buf[100] = "你好abc"; int len = 0; int i = 0; while (buf[i]) { if (buf[i] < 0) i++; i++; len++; } //len--; return len; }
#include <stdlib.h> #include <stdio.h> #include <time.h> int main() { /* srand() 用法,一般情況下跟time 時間戳一起使用 */ time_t tm = time(NULL); srand(tm);//隨便機種子發生器 printf("%d\n", tm); //printf("%d\n", srand(tm)); /* rand() 用法 */ for (int i = 0; i < 10; i++) { int value = rand(); printf("%d\n", value); } return 0; }
1.5 字串的輸入與輸出 1 用scanf/printf輸入輸出字串 char s[100]; printf("請輸入一個字串:"); scanf("%s", s); //輸入字串不能超過字串定義的長度,不然程式會崩潰 printf("%s", s); //列印字串 注:scanf回車或空格做為字串結束標識 輸出"hello world"只會打印出hello(到空格就結束了) 2 用gets/puts函式輸入輸出 用法:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s[100];
printf("請輸入一個字串:");
gets(s);//使用gets函式獲取輸入的字串
puts(s);
return 0;
}
注: 1 gets() 只把回車當結束標識,不會把空格當成結束標識, scanf 兩個都當成結束標識 2 gets() 與 scanf()都會出現快取溢位問題 ; 3 gets() 只能把輸入物件 的當字串處理 ,scanf() 可以通過 %c,%d 等來將輸入物件轉義 可以用atoi() 將輸入的物件強制轉換成你int 型別 4 puts 輸出完後會直接換行 3 fgets()函式 用法:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s[100];
printf("請輸入一個字串:");
gets(s);//使用gets函式獲取輸入的字串
puts(s);
return 0;
}
注:1 fgets()函式:從標準輸入中取出前N個位元組放入字元陣列中 2 fgets() 是安全的,gets() ,scanf() 都會出現快取溢位問題 3 其它與gets()用法類似 1.6 其它字串函式<所在標頭檔案string.h> 1.6.1 strlen:返回有效字串長度,不包含結尾的0 用法: size_t strcat(char * _Str1,constchar * _Str2); 程式碼: int slen = strlen("hello,world") ; 1.6.2 strncat,strcat字串有限追加 size_t strncat(char * _Str1,constchar * _Str2, size_t len); 程式碼: char s1[100] = "hello"; char s2[200] = "world"; strncat(s1,s2);// s1 變成helloworld 注:strcat當兩個拼接之和長度大於[100] 會快取溢位,導致程式崩潰 strncat:會丟掉溢位的部分,並不他報錯,但會損失精度 1.6.3 strcmp,strncmp,字串比較 int strcmp(constchar * _Str1,constchar * _Str2); 比較兩個字串是否相等,相等返回0,不等返回非0 int strcmp(constchar * _Str1,constchar * _Str2,n); 比較兩個字串的前N個字元是否相等,相等返回0,不等返回非0 程式碼:
#include <stdio.h>
int main()
{
char s1[100] ="hello";
char s2[100] = "helloworld";
if (strcmp(s1, s2) == 0)
{
printf("相同\n");
}
else
{
printf("不相同\n");
}
if (strncmp(s1, s2, 5) == 0)
{
printf("相同\n");
}
else
{
printf("不相同\n");
}
}
列印結果: 不相同 相同 1.7.10strcpy,strncpy字串拷貝 char *strcpy(char * _Str1,constchar * _Str2); char *strncpy(char * _Str1,constchar * _Str2,N); 將引數_Str2拷貝到引數_Str1中 將引數_Str2的前N個字元拷貝到引數_Str1中 程式碼:
#include <stdio.h>
int main()
{
char s1[100] ="abc1234 ";
char s2[100] = "def6789";
strncpy(s1, s2, 3);
printf("%s\n", s1); //def1234
strcpy(s1, s2);
printf("%s\n", s1);def6789
}
1.7.12sprintf,格式化字串 和printf函式功能類似,printf函式將格式化結果輸出到螢幕,sprintf將格式化結果輸出到字串 程式碼:
#include <stdio.h>
int main()
{
int i = 100;
char s[100];
sprintf(s, "i = %d", i); //將引號的內容輸出到字串s中
printf("%s\n", s);//結果 i =100;
}
1.7.13Sscanf函式 Sscanf類似於scanf函式,,scanf從鍵盤讀取使用者輸入,scanf從指定格式化字串讀取輸入 程式碼: int a = 0; sscanf(s,"輸入一個數字:%d",&a);//將引號內容及標準輸入放到s中 1.7.14strchr查詢字元 char * strchr(char *_Str,int_Ch); 在引數_str中查詢引數_Ch指定字元,找到返回字元_Ch在_Str中所在位置,沒有找到返回NULL; 程式碼: char *buf = strchr( "hello",'h'); //檢視前面字串“hello”中是否有'h' 字元,; 1.7.15strstr查詢子串 char * strstr(char *_Str,constchar *_SubStr) 在引數_str中查詢引數_SubStr指定子串,找到返回子串在_Str中所在位置,沒有找到返回NULL; 程式碼: char *buf = strchr( "helloworld",'hello'); //檢視前面字串“helloworld”中是否有'hello' 字元,; 1.7.16strtok分割字串 字元在第一次呼叫時strtok()必需給予引數s字串,往後的呼叫則將引數s設定成NULL每次呼叫成功則返回指向被分割出片段的指標 程式碼:
#include <stdio.h>
int main()
{
char s[100];
s[100] = "hello_world_!";
char buf[100];
buf[100] = strtok(s, '_');
while (buf)
{
printf("%s\n",buf);
buf[100] = strtok(NULL, "_");
}
return 0;
}
1.7.17atoi轉化為int,float,long 需要包含標頭檔案stdlib.h 直接將你字串型別的”200“ 轉換成 int 型別的200 程式碼:
char s[100];
s[100] = "200";
int i = atoi(s);