C語言中處理字串的函式
在C語言中有許多字串處理函式,在寫程式的時候常常想不起來或則不瞭解區別,今天就花點時間將這些函式做個總結,以便以後查詢使用。
一、輸入函式
- scanf 與 scanf_s 函式
char buf[10] = { 0 };
scanf("%s", buf);//輸入:tttt3
printf("buf = %s\n", buf);//結果:buf = tttt3
char buf1[10] = {0};
scanf_s("%s", buf1, 10);//輸入:yyyy355
printf("buf1 = %s\n", buf1);//結果:buf1 = yyyy355
當使用scanf 函式來讀取字串的時候需要注意兩點:
① scanf 函式如果輸入的字元數大於定義的字元陣列長度就會出現緩衝區溢位。
② 當輸入的字串中包含空格時,scanf 和 scanf_s 函式只會接收空格前的字串。例如:hello world 則只會接收到:hello
③ scanf_s 函式最後一個引數代表緩衝區的大小,示例中緩衝區大小為10,但最多能放入9個字元,因為最後一個需要放’\0’
- gets 與 gets_s 函式
char buf[10] = {0};
gets(buf);
gets_s(buf,10);
printf("buf = %s\n",buf);
① gets 函式解決了scanf 和 scanf_s 不能輸入空格的問題,但是沒有解決緩衝區溢位的問題。
② gets 函式由於也不安全所以被 gets_s 函式代替,該函式的後一個引數代表緩衝區大小。
- fgets 函式
char buf[10] = { 0 };
fgets(buf, sizeof(buf), stdin);//輸入:devbird
printf("buf = %s\n", buf);//輸出:buf = devbird
① fgets 改進了 gets 函式緩衝區溢位的問題,fgets 函式是為讀取檔案設計的,
所以讀取鍵盤時沒有 gets 那麼方便。
② fgets 函式是安全函式,所以程式中使用此函式更安全。
二、輸出函式
- printf 與 printf_s 函式
char* str="hello world";
printf("%s\n",str);
printf_s("%s\n",str);
這兩個函式都是輸出函式,區別在於 printf_s 函式會檢查前面一個引數的格式化字元是否合法。
- puts 與 fputs 函式
char* str="hello world" ;
puts(str);
fputs(str,stdout);
① puts 函式與 printf 不同,會自動在末尾新增一個’\n’
② fputs 函式和 fgets 函式一樣也是安全的函式,在程式中使用更安全。
三、字串處理函式
- strlen 函式
char* str = "12345";
int len = strlen(str);
printf("len = %d\n", len);
該函式是計算字串長度的函式,但不包含字串結尾的’\0’
- strcat 與 strncat 函式
char str1[10] = {'1','2','3'};
char str2[5] = {'x','y','z','w'};
strcat(str1, str2);//把str2追加到str1的後面
strncat(str1, str2, sizeof(str1) – strlen(str1) - 1);//把str2追加到str1的後面,最後一個引數是str1剩餘的長度。
printf("string = %s\n", str1);
① 這兩個函式都是拼接字串的函式。
② str1一定要有足夠的空間來放str2,不然會記憶體溢位。
③ strncat 函式比 strcat 函式更安全。
- strcmp 與 strncmp 函式
char* str1 = "hello";
char* str2 = "hellojj";
int result1 = strcmp(str1, str2);//比較兩個字串
printf("result1 = %d\n", result1);
int result2 = strncmp(str1, str2, 5);//最後一個引數代表,比較兩個字串的前n個
printf("result2 = %d\n", result2);
① strcmp 函式,如果兩個字串相同,則返回0,否則為非0
② strncmp 函式,最後一個引數代表比較的前n個字元,如果兩個數前n個相同則返回0,否則為非0
- strcpy 與 strncpy 函式
char strBuf[20] = {0};
char* str = "hello devbird";
strcpy(strBuf, str);//將str中的字串拷貝到strBuf中
printf("strBuf = %s\n", strBuf);
strncpy(strBuf, str, 8);//將str中的前8個字元拷貝到strBuf中
printf("strBuf = %s\n", strBuf);
① 兩個函式都是拷貝字串函式,有緩衝區溢位危險。
② strncpy 最後一個引數代表要拷貝的字元數。
- sprintf 函式
char buf[50];
sprintf(buf, "我有%d塊錢!", 100);
printf("buf = %s\n", buf);//輸出結果:buf = 我有100塊錢!
① printf是向螢幕輸出一個字串。
② sprintf是向char陣列輸出一個字串,其他行為和printf一模一樣。
③ sprintf也存在緩衝區溢位的問題。
- strchr 函式
char* str = "devbird";
char* result = strchr(str, 'b');
printf("result = %s\n", result);//結果:result = bird
char* res = strchr(str, 'z');
printf("res = %s\n", res);//結果:res = (null)
該函式是查詢字元的函式,如果能找到則返回當前字元及其後面的字元,否則返回為null
- strstr 函式
char* str = "I am a Android developer!";
char* subStr = "Android";
char* result = strstr(str, subStr);
printf("result = %s\n", result);//結果:result = Android developer!
該函式是查詢子字串,返回值為子字串第一次出現的位置及其後面的字串,如果沒查詢到則返回為NULL
- strtok 函式
char str[] = "2016/08/29 20:06:55";
char* result = strtok(str, "/");
while (result)
{
printf("result = %s\n", result);//結果:result = 2016
// result = 08
// result = 29 20:06:55
result = strtok(NULL, "/");
}
字元在第一次呼叫時strtok()必需給予引數str字串,往後的呼叫則將引數str設定成NULL,每次呼叫成功則返回指向被分割出片段的指標。
- atoi 函式
char* str = "123";
int i = atoi(str);
printf("i = %d\n", i);//輸出:i = 123
該函式是一個將數字字串轉換成int型別的函式。
- atof 函式
char* str = "29.3547";
float f = atof(str);
printf("f = %f\n", f);//輸出:f = 29.354700
該函式是將一個數字字串轉換成float型別的函式。
- atol 函式
char* str = "31465666";
long l = atof(str);
printf("ld = %ld\n", l);//輸出:ld = 31465666
該函式是將數字字串轉換成長整型的函式。
四、隨機數函式
- rand 與 srand函式
int t = (int)time(NULL);
srand(t);
for (int i = 0; i < 3; i++)
{
printf("randNum = %d\n", rand());
//輸出:randNum = 14824
// randNum = 16692
// randNum = 15958
}
① 使用該函式需要包含標頭檔案:#include <time.h>
② 通過time函式生成一個不同的int數。