發(fā)布于:2021-02-21 00:05:20
1
834
0
C中的String是什么?
C中的字符串只不過是線性序列中字符的集合?!癈”總是將字符串視為單個數(shù)據(jù),即使它包含空格。使用單引號表示法定義單個字符。字符串用雙引號表示。
Example, "Welcome to the world of programming!"
'C'提供了標(biāo)準(zhǔn)庫<string.h>,其中包含許多函數(shù),可用于輕松地對C中的字符串執(zhí)行復(fù)雜的操作。
如何在C中聲明和初始化字符串
C字符串是以char作為數(shù)據(jù)類型的簡單數(shù)組?!癈”語言不直接支持字符串作為數(shù)據(jù)類型。因此,要在C中顯示字符串,需要使用字符數(shù)組。
在C中將變量聲明為字符串的一般語法如下:
char string_variable_name [array_size];
字符串的經(jīng)典聲明可以如下所示:
char string_name[string_length] = "string";
聲明C字符串變量時必須定義數(shù)組的大小,因為它用于計算C字符串變量中要存儲的字符數(shù)。字符串聲明的一些有效示例如下:
char first_name[15]; //declaration of a string variable
char last_name[15];
上面的示例表示數(shù)組大小為15的字符串變量。這意味著給定的C字符串?dāng)?shù)組最多只能容納15個字符。數(shù)組的索引從0開始,因此它將存儲0-14位置的字符。C編譯器會自動將空字符“| 0”添加到創(chuàng)建的字符數(shù)組中。
讓我們研究一下C中的字符串初始化。下面的示例演示了C中字符串的初始化
char first_name[15] = "ANTHONY";
char first_name[15] = {'A','N','T','H','O','N','Y',''}; // NULL character '' is required at end in this declaration
char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */
char string2 [ ] = "world"; /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */
char string3[6] = {'h', 'e', 'l', 'l', 'o', ''} ; /*Declaration as set of characters ,Size 6*/
在string3中,必須顯式添加空字符,并且字符用單引號括起來。
“C”還允許我們在不定義字符數(shù)組大小的情況下初始化字符串變量。可以通過以下方式實現(xiàn)。
char first_name[ ] = "NATHAN";
C中字符串的名稱用作指針,因為它基本上是一個數(shù)組。
字符串輸入:讀取字符串
在編寫要求用戶輸入的交互式程序時,C提供scanf()、get()和fgets()函數(shù)來查找用戶輸入的一行文本。
使用scanf()讀取時,我們使用“%s”格式說明符而不使用“&;”來訪問變量地址,因為數(shù)組名充當(dāng)指針。例如:
#includeint main() {
char name[10];
int age;
printf("Enter your first name and age: n");
scanf("%s %d", name, &age);
printf("You entered: %s %d",name,age);
}
輸出:
Enter your first name and age:
John_Smith 48
scanf函數(shù)的問題是它從不讀取C中的整個字符串。一旦出現(xiàn)空格、換行符、垂直制表符、換行符或回車符,它就會停止讀取過程。假設(shè)我們以“Guru99 Tutorials”的形式提供輸入,那么scanf函數(shù)將永遠不會讀取整個字符串,因為兩個名稱之間會出現(xiàn)一個空格字符。scanf函數(shù)將只讀取Guru99。
為了讀取包含空格的字符串,我們使用gets()函數(shù)。獲取忽略空格。當(dāng)?shù)竭_換行符(按下回車鍵)時,它停止讀取。例如:
#include <stdio.h>
int main() {
char full_name[25];
printf("Enter your full name: ");
gets(full_name);
printf("My full name is %s ",full_name);
return 0;
}
輸出:
Enter your full name: Dennis Ritchie
My full name is Dennis Ritchie
另一個比gets()更安全的替代方法是fgets()函數(shù),它讀取指定數(shù)量的字符。例如:
#include <stdio.h>
int main() {
char name[10];
printf("Enter your name plz: ");
fgets(name, 10, stdin);
printf("My name is %s ",name);
return 0;}
輸出:
Enter your name plz: Carlos
My name is Carlos
fgets()參數(shù)是:
字符串名,
要讀取的字符數(shù),
stdin表示從標(biāo)準(zhǔn)輸入(即鍵盤)讀取。
字符串輸出:打印/顯示字符串
標(biāo)準(zhǔn)printf函數(shù)用于在輸出設(shè)備上以C打印或顯示字符串。使用的格式說明符是%s。
例如
printf("%s", name);
字符串輸出是通過fputs()和printf()函數(shù)完成的。
fputs()函數(shù)
fputs()需要字符串的名稱和指向要顯示文本的位置的指針。我們使用標(biāo)準(zhǔn)輸出的stdout來打印到屏幕。用于示例:
#include <stdio.h>
int main()
{char town[40];
printf("Enter your town: ");
gets(town);
fputs(town, stdout);
return 0;}
輸出:
Enter your town: New York
New York
puts函數(shù)
puts函數(shù)用于在輸出設(shè)備上打印C中的字符串,并將光標(biāo)移回第一個位置。puts函數(shù)可按以下方式使用:
#include <stdio.h>
int main() {
char name[15];
gets(name); //reads a string
puts(name); //displays a string
return 0;}
這個函數(shù)的語法比其他函數(shù)簡單。
字符串庫
標(biāo)準(zhǔn)的“ C”庫提供各種功能來操縱程序中的字符串。這些函數(shù)也稱為字符串處理程序。所有這些處理程序都存在于<string.h>頭文件中。
讓我們考慮下面的程序,該程序演示了字符串庫功能:
#include <stdio.h>
#include <string.h>
int main () {
//string initialization
char string1[15]="Hello";
char string2[15]=" World!";
char string3[15];
int val;
//string comparison
val= strcmp(string1,string2);
if(val==0){
printf("Strings are equaln");
}
else{
printf("Strings are not equaln");
}
//string concatenation
printf("Concatenated string:%s",strcat(string1,string2)); //string1 contains hello world!
//string length
printf("nLength of first string:%d",strlen(string1));
printf("nLength of second string:%d",strlen(string2));
//string copy
printf("nCopied string is:%sn",strcpy(string3,string1)); //string1 is copied into string3
return 0;
}
輸出:
Strings are not equal
Concatenated string:Hello World!
Length of first string:12
Length of second string:7
Copied string is:Hello World!
其他重要的庫函數(shù)包括:
strncmp(str1,str2,n):如果str1的前n個字符等于str2的前n個字符,則返回0;如果str1 <str2,則小于0;如果str1> str2,則大于0。
strncpy(str1,str2,n)此函數(shù)用于從另一個字符串復(fù)制一個字符串。將str2的前n個字符復(fù)制到str1
strchr(str1,c):它返回指向str1中首次出現(xiàn)的char c的指針,如果找不到字符,則返回NULL。
strrchr(str1,c):它反向搜索str1并返回一個指向char c在str1中位置的指針;如果找不到字符,則返回NULL。
strstr(str1,str2):它返回指向str1中第一次出現(xiàn)的str2的指針,如果未找到str2,則返回NULL。
strncat(str1,str2,n)將str2的前n個字符附加(連接)到str1的末尾,并返回指向str1的指針。
strlwr():將字符串轉(zhuǎn)換為小寫。
strupr():將字符串轉(zhuǎn)換為大寫。
strrev():反轉(zhuǎn)字符串。
將字符串轉(zhuǎn)換為數(shù)字
在C編程中,我們可以將一串?dāng)?shù)字字符轉(zhuǎn)換為一個數(shù)字值,以防止運行時錯誤。stdio.h庫包含以下用于將字符串轉(zhuǎn)換為數(shù)字的函數(shù):
int atoi(str)代表ASCII到整數(shù);它將str轉(zhuǎn)換為等效的int值。如果第一個字符不是數(shù)字或未遇到數(shù)字,則返回0。
double atof(str)表示ASCII浮動,它將str轉(zhuǎn)換為等效的double值。如果第一個字符不是數(shù)字或未遇到數(shù)字,則返回0.0。
long int atol(str)代表ASCII到long int,將str轉(zhuǎn)換為等效的long整數(shù)值。如果第一個字符不是數(shù)字或未遇到數(shù)字,則返回0。
以下程序演示了atoi()函數(shù):
#include <stdio.h>
int main()
{char *string_id[10];
int ID;
printf("Enter a number: ");
gets(string_id);
ID = atoi(string_id);
printf("you enter %d ",ID);
return 0;}
輸出:
Enter a number: 221348
you enter 221348
字符串指針聲明(例如char * string =“ language”)是常量,不能修改。
概要
字符串是存儲在字符數(shù)組中的一系列字符。
字符串是用雙引號引起來的文本。
諸如“ d”之類的字符不是字符串,而是用單引號引起來。
“ C”提供了標(biāo)準(zhǔn)的庫函數(shù)來處理程序中的字符串。字符串操縱器存儲在<string.h>頭文件中。
在用于程序之前,必須聲明或初始化字符串。
有不同的輸入和輸出字符串函數(shù),每個函數(shù)都有其功能。
不要忘記包括字符串庫以使用其功能
我們可以通過atoi(),atof()和atol()將字符串轉(zhuǎn)換為數(shù)字,這對于編碼和解碼過程非常有用。
我們可以通過在C中定義字符串?dāng)?shù)組來操縱不同的字符串。