C語(yǔ)言字符數(shù)組與字符串?dāng)?shù)組
在C語(yǔ)言中,字符數(shù)組和字符串?dāng)?shù)組實(shí)際上是同一種類型。字符串是由字符組成的字符數(shù)組,通常以空字符 '\\0' 結(jié)尾。C語(yǔ)言中的字符串是一種常見(jiàn)的數(shù)據(jù)類型。我們可以通過(guò)兩種方式定義字符數(shù)組跟字符串?dāng)?shù)組
char charArray[10]; // 定義一個(gè)包含10個(gè)字符的字符數(shù)組
char strArray[10] = "Hello"; // 定義并初始化一個(gè)字符串?dāng)?shù)組
常用函數(shù)之strlen()函數(shù)
strlen
是 C 語(yǔ)言中的一個(gè)字符串函數(shù),用于計(jì)算字符串的長(zhǎng)度,即字符串中字符的個(gè)數(shù)(注意它是不包括結(jié)尾的空字符 '\\0')。
函數(shù)原型如下:
size_t strlen(const char *str);
參數(shù) str
是一個(gè)指向以空字符 '\\0' 結(jié)尾的字符串的指針。函數(shù)返回一個(gè) size_t
類型的值,表示字符串的長(zhǎng)度。
以下是一個(gè)使用 strlen
函數(shù)的示例代碼:
#include < stdio.h >
#include < string.h >
int main(void)
{
char str[] = "Hello, World!";
size_t length = strlen(str);
printf("Length of the string: %zu\\n", length);
return0;
}
在上述示例中,我們定義了一個(gè)字符串 str
,并使用 strlen
函數(shù)計(jì)算字符串的長(zhǎng)度,將結(jié)果保存在變量 length
中。最后,使用 printf
函數(shù)打印字符串的長(zhǎng)度。
輸出結(jié)果為:
Length of the string: 13
注意,strlen
函數(shù)返回的長(zhǎng)度不包括結(jié)尾的空字符 '\\0'。所以對(duì)于上述示例中的字符串 "Hello, World!",雖然實(shí)際占用的字符數(shù)為 13,但 strlen
函數(shù)返回的結(jié)果是 13,而不是 14。這是因?yàn)?C 語(yǔ)言中的字符串以空字符 '\\0' 結(jié)尾,作為字符串的結(jié)束標(biāo)志。
5個(gè)字母+1個(gè)逗號(hào) + 1個(gè)空格 + 5個(gè)字母+1個(gè)感嘆號(hào) = 13個(gè)字節(jié)
常用函數(shù)之strcpy()函數(shù)
strcpy
是 C 語(yǔ)言中的一個(gè)字符串函數(shù),用于將一個(gè)字符串復(fù)制到另一個(gè)字符串中。
函數(shù)原型如下:
char *strcpy(char *dest, const char *src);
參數(shù) dest
是目標(biāo)字符串的指針,src
是源字符串的指針。函數(shù)將源字符串的內(nèi)容復(fù)制到目標(biāo)字符串中,并返回指向目標(biāo)字符串的指針。//后面的字符串被復(fù)制到前面的那個(gè)字符串 并返回指向的目標(biāo)字符串指針
以下是一個(gè)使用 strcpy
函數(shù)的示例代碼:
#include < stdio.h >
#include < string.h >
int main(void)
{
char src[] = "Hello";
char dest[10];
strcpy(dest, src);
printf("Copied string: %s\\n", dest);
return0;
}
在上述示例中,我們定義了一個(gè)源字符串 src
,內(nèi)容為 "Hello",以及一個(gè)目標(biāo)字符串 dest
,大小為 10。使用 strcpy
函數(shù)將源字符串的內(nèi)容復(fù)制到目標(biāo)字符串中。最后,使用 printf
函數(shù)打印目標(biāo)字符串的內(nèi)容。
輸出結(jié)果為:
Copied string: Hello
注意,在使用 strcpy
函數(shù)時(shí),需要確保目標(biāo)字符串的緩沖區(qū)足夠大以容納源字符串的內(nèi)容。否則,可能會(huì)導(dǎo)致緩沖區(qū)溢出的錯(cuò)誤。此外,確保源字符串以空字符 '\\0' 結(jié)尾,以便 strcpy
函數(shù)正確復(fù)制整個(gè)字符串。
常用函數(shù)之strcmp()函數(shù)
strcmp
是 C 語(yǔ)言中的一個(gè)字符串函數(shù),用于比較兩個(gè)字符串是否相等。
函數(shù)原型如下:
int strcmp(const char *str1, const char *str2);
參數(shù) str1
和 str2
是兩個(gè)要比較的字符串的指針。函數(shù)返回一個(gè)整數(shù)值,表示比較結(jié)果的大小關(guān)系:
- 如果
str1
和str2
相等,則返回 0。 - 如果
str1
按字典順序小于str2
,則返回負(fù)數(shù)。 - 如果
str1
按字典順序大于str2
,則返回正數(shù)。
什么是按照字典排序呢?
按字典順序是一種基于字母或字符的比較方式,類似于字典中單詞的排列順序。在 C 語(yǔ)言中,字符串的比較操作是按照字典順序進(jìn)行的。
字典順序比較的規(guī)則如下:
- 比較字符串中對(duì)應(yīng)位置的第一個(gè)字符。
- 如果兩個(gè)字符不相等,那么根據(jù)它們的 ASCII 值來(lái)確定它們的大小關(guān)系。較小的字符被認(rèn)為是在字典中 較早的位置 ,較大的字符被認(rèn)為是在字典中 較后的位置 。
- 如果兩個(gè)字符相等,則繼續(xù)比較下一個(gè)字符,直到找到不相等的字符或遇到字符串的結(jié)尾(即遇到空字符 '\\0')。
- 如果其中一個(gè)字符串到達(dá)結(jié)尾而另一個(gè)字符串還有剩余字符,則被認(rèn)為到達(dá)結(jié)尾的字符串較小。
以下是一些示例,幫助理解按字典順序比較字符串的結(jié)果:
- "apple" 按字典順序小于 "banana",因?yàn)?'a' 比 'b' 小。ASCII碼值小
- "cat" 按字典順序大于 "dog",因?yàn)?'c' 比 'd' 大。
- "hello" 按字典順序等于 "hello",因?yàn)槊總€(gè)對(duì)應(yīng)位置的字符都相等。
- "open" 按字典順序大于 "office",因?yàn)樵诘谝粋€(gè)字符 'o' 相等的情況下,第二個(gè)字符 'p' 比 'f' 大。
需要注意的是,字母的大小比較是基于其對(duì)應(yīng)的 ASCII 值進(jìn)行的。在 ASCII 編碼中,小寫字母的 ASCII 值比大寫字母的 ASCII 值大*。因此,在按字典順序比較字符串時(shí),大寫字母會(huì)被認(rèn)為是在相應(yīng)小寫字母之前。*
理解按字典順序比較字符串的概念對(duì)于正確使用字符串比較函數(shù)(如 strcmp
)以及處理字符串排序等操作非常重要。
以下是一個(gè)使用 strcmp
函數(shù)的示例代碼:
#include < stdio.h >
#include < string.h >
int main(void)
{
char str1[] = "Hello";
char str2[] = "World";
int result = strcmp(str1, str2);
if (result == 0)
{
printf("Strings are equal.\\n");
}
elseif (result < 0)
{
printf("str1 is less than str2.\\n");
}
else
{
printf("str1 is greater than str2.\\n");
}
return0;
}
在上述示例中,我們定義了兩個(gè)字符串 str1
和 str2
,分別賦值為 "Hello" 和 "World"。使用 strcmp
函數(shù)比較這兩個(gè)字符串,并將結(jié)果保存在變量 result
中。然后根據(jù)比較結(jié)果打印相應(yīng)的消息。
輸出結(jié)果為:
str1 is less than str2.
在此示例中,由于 "Hello" 按字典順序小于 "World",所以 strcmp
函數(shù)返回一個(gè)負(fù)數(shù)值,表明 str1
小于 str2
。根據(jù)返回的結(jié)果,我們輸出了相應(yīng)的消息。
需要注意的是,strcmp
函數(shù)是區(qū)分大小寫的。如果要執(zhí)行不區(qū)分大小寫的字符串比較,可以使用 strcasecmp
函數(shù)(在一些編譯器中可能稱為 _stricmp
)。
這是在dev的string.h一段代碼 它支持strcasecmp 以及_stricmp
#ifndef __CRT__NO_INLINE
__CRT_INLINE int __cdecl strncasecmp (const char *__sz1, const char *__sz2, size_t __sizeMaxCompare) { return _strnicmp (__sz1, __sz2, __sizeMaxCompare); }
__CRT_INLINE int __cdecl strcasecmp (const char *__sz1, const char *__sz2) { return _stricmp (__sz1, __sz2); }
#else
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#endif /* !__CRT__NO_INLINE */
常用函數(shù)之strcat()函數(shù)
strcat
是 C 語(yǔ)言中的一個(gè)字符串函數(shù),用于將一個(gè)字符串連接到另一個(gè)字符串的末尾。
函數(shù)原型如下:
char *strcat(char *dest, const char *src);
參數(shù) dest
是目標(biāo)字符串的指針,src
是源字符串的指針。函數(shù)將源字符串的內(nèi)容連接到目標(biāo)字符串的末尾,并返回指向目標(biāo)字符串的指針。
以下是一個(gè)使用 strcat
函數(shù)的示例代碼:
#include < stdio.h >
#include < string.h >
int main(void)
{
char str1[20] = "Hello";
char str2[] = ", World!";
strcat(str1, str2);
printf("Concatenated string: %s\\n", str1);
return0;
}
在上述示例中,我們定義了一個(gè)目標(biāo)字符串 str1
,大小為 20,并初始化為 "Hello"。然后,定義了一個(gè)源字符串 str2
,內(nèi)容為 ", World!"。使用 strcat
函數(shù)將 str2
連接到 str1
的末尾,修改了 str1
的內(nèi)容。最后,使用 printf
函數(shù)打印連接后的字符串。
輸出結(jié)果為:
Concatenated string: Hello, World!
strcat
函數(shù)會(huì)將源字符串的內(nèi)容追加到目標(biāo)字符串的末尾,并確保目標(biāo)字符串以空字符 '\\0' 結(jié)尾。在示例中,str1
原先以空字符結(jié)尾,strcat
函數(shù)會(huì)將 str2
的內(nèi)容從 str1
結(jié)尾處開(kāi)始拷貝,覆蓋掉 str1
的空字符,并在連接的末尾添加一個(gè)新的空字符。
需要注意的是,在使用 strcat
函數(shù)時(shí),確保目標(biāo)字符串的緩沖區(qū)足夠大,以容納源字符串的內(nèi)容和額外的空字符。否則,可能會(huì)導(dǎo)致緩沖區(qū)溢出的錯(cuò)誤。
類似這樣的函數(shù)還有哪些呢?
除了這幾個(gè)常見(jiàn)的字符串函數(shù)外,C 語(yǔ)言還有許多其他常用的字符串函數(shù)。以下是一些高頻使用的字符串函數(shù):
strcat
:用于將一個(gè)字符串連接到另一個(gè)字符串的末尾。strncat
:類似于strcat
,但是可以指定要連接的字符數(shù)。strcmp
:已經(jīng)提到過(guò),用于比較兩個(gè)字符串是否相等。strncmp
:類似于strcmp
,但是可以指定要比較的字符數(shù)。strcpy
:已經(jīng)提到過(guò),用于將一個(gè)字符串復(fù)制到另一個(gè)字符串中。strncpy
:類似于strcpy
,但是可以指定要復(fù)制的字符數(shù)。strchr
:在字符串中搜索指定字符的第一個(gè)出現(xiàn)位置,并返回指向該位置的指針。strrchr
:在字符串中搜索指定字符的最后一個(gè)出現(xiàn)位置,并返回指向該位置的指針。strstr
:在字符串中搜索指定子字符串的第一個(gè)出現(xiàn)位置,并返回指向該位置的指針。strtok
:將字符串分割成多個(gè)子字符串,使用指定的分隔符進(jìn)行分割。sprintf
:將格式化的數(shù)據(jù)寫入字符串。sscanf
:從字符串中讀取格式化的數(shù)據(jù)。strlen
:已經(jīng)提到過(guò),用于計(jì)算字符串的長(zhǎng)度。memset
:將指定的值復(fù)制到字符串的每個(gè)字符。memcpy
:將一個(gè)字符串的內(nèi)容復(fù)制到另一個(gè)字符串。
這些函數(shù)是 C 語(yǔ)言中處理字符串時(shí)經(jīng)常使用的函數(shù),它們提供了廣泛的功能,可用于字符串操作、搜索、比較、復(fù)制等。了解和熟練使用這些函數(shù)對(duì)于處理字符串?dāng)?shù)據(jù)非常重要。建議在需要使用特定功能時(shí),查閱相關(guān)函數(shù)的文檔并參考示例代碼以確保正確使用。
-
編碼器
+關(guān)注
關(guān)注
45文章
3664瀏覽量
135075 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137438 -
ASCII
+關(guān)注
關(guān)注
5文章
172瀏覽量
35165
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論