字符串是一種重要的數據類型,但C語言中沒有顯式的字符串數據類型。頭文件string.h中包含了大多數對字符串的操作函數。因此,有字符串的操作時,一般會包含string.h頭文件。
1、字符串的長度:對字符串進行的操作中,經常要對它進行求長度的操作。字符串的長度就是它所包含的字符個數。**size_t strlen(char const *string);
注意:strlen返回一個類型為size_t的值,它是一個無符號整數類型。在表達式中使用無符號數可能導致不可預料的結果。
**如下面兩條表達式并不相等:**
**if(strlen(x) >= strlen(y)) .... /*按照預想的那樣工作*/**
**if(strlen(x) - strlen(y) >= 0).../*永遠為真,strlen的結果是個無符號數,所以操作符>=左邊的表達式也將是無符號數*/**
~~~
size_t
strlen(char const *string)
{
int length;
for(length = 0; *string++ != '\0';)
length++;
return length;
}
~~~
2、復制字符串:用于復制字符串的函數時strcpy,原型如下:char *strcpy(char *dst, char const *src); 它把參數src字符串復制到dst參數。dst參數的以前內容將被覆蓋掉并丟失。即使新的字符串比dst原先的內存更短,由于新字符串以NUL字節結尾,所以老字符串最后剩余的幾個字符也會被有效地刪除,(其實并為被刪除,可以使用地址訪問)。
我們必須確保目標字符數組的空間足以容納需要復制的字符串。如果字符串比數組長,多余的字符仍被復制,它們將覆蓋原先存儲于數組后面的內存空間的值。在使用該函數前確保目標參數足以容納源字符串,就可以避免大量的調試工作。
~~~
#include <string.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
char message[] = "Original message";
printf("%c.\n", message[2]);//結果是Original中的i
strcpy(message, "Different");
printf("%s.\n", message);/*結果是Different,后面的message因為NUL的原因未顯示*/
printf("%c.\n", message[2]);//結果是Different中的f
printf("%c.\n", message[12]);//結果是message中的s
return 0;
}
~~~
3、連接字符串:把一個字符串添加(連接)到另一個字符串的后面。原型:char *strcat(char *dst, char const *src); 該函數要求dst參數原先已經包含了一個字符串,它找到這個字符串的末尾,并把src字符串的一份拷貝添加到這個位置。同樣應該確保目標字符數組剩余的空間足以保存整個源字符串。
~~~
#include <string.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
char message[100];
strcpy(message, "Hello ");
strcat(message, "World.\n");
printf("message = %s",message);
return 0;
}
~~~
注意:strcpy和strcat函數都返回它們第1個參數的一份拷貝,就是指向目標字符數組的指針。在實際應用中,它們的返回值經常只是簡單的被忽略。
4、字符串比較:比較兩個字符串涉及對兩個字符串對應的字符逐個進行比較,直到發現不匹配為止。
原型:int strcmp(char const *s1, char const *s2);
如果s1小于s2,返回值小于0;
如果s1大于s2,返回值大于0;
如果s1等于s2,返回值等于0;
5、其他字符串函數
char *strncpy(char *dst, char const *src, size_t len);向dst寫入len個字符。如果strlen(src)的值小于len,dst數組就用額外的NUL字節填充到len長度。如果strlen(src)的值大于或等于len,那么只有len個字符被復制到dst中。注意,它的結果將不會以NUL字節結尾。
char *strncat(char *dst, char const *src, size_t len);
intstrncmp(char const *s1, char const *s2, size_t len);
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配