前言
字符串(character string)是一個(gè)或多個(gè)字符的序列,空字符(null character)\0 標(biāo)記字符串的結(jié)束
字符串以數(shù)組(array)存儲(chǔ),也就是以空字符(\0)結(jié)尾的 char 類型數(shù)組
用 %s 轉(zhuǎn)換說(shuō)明來(lái)處理字符串的輸入和輸出
輸入和輸出必須給出字符串的首地址,可以直接是字符串常量、字符數(shù)組名,或者字符指針變量名
scanf() 輸入數(shù)據(jù)時(shí),要注意函數(shù)在讀到空格、制表符或換行符就會(huì)停止
一、字符串
C語(yǔ)言中,以數(shù)組來(lái)表示字符串
1.字符串常量
? 用一對(duì)雙引號(hào)包含的一個(gè)或多個(gè)字符的序列,在內(nèi)存中存放時(shí),以’\0’(空字符)標(biāo)記字符串的結(jié)束(\0是數(shù)值轉(zhuǎn)義字符,對(duì)應(yīng)的ASCII碼為數(shù)值0)
? 字符串不論什么情況,結(jié)尾都會(huì)自動(dòng)加一個(gè)’\0’
? 字符串一定以空字符結(jié)束,這意味著數(shù)組的容量必須至少比待存儲(chǔ)字符串中的字符多1,例如 char name[5];
只能存儲(chǔ)4個(gè)字符,剩下一個(gè)字節(jié)留給空字符
2.注意 scanf() 讀取字符串
我們用 scanf() 輸入時(shí),要注意函數(shù)在讀到空格、制表符或換行符就會(huì)停止,如“ab c”,只會(huì)讀取"ab"
例如,scanf() 輸入中間有空格的字符串后觀察打印情況
源代碼:
#include <stdio.h>
int main()
{
char str[40] = { 0 };
printf("請(qǐng)輸入:");
scanf("%s", str);//不需要&,數(shù)組名就是首元素地址
printf("輸出為:");
printf("%s\n", str);
return 0;
}
運(yùn)行結(jié)果:
再來(lái)觀察一下數(shù)組內(nèi)的數(shù)據(jù):
? 可以看到,用戶以 scanf() 函數(shù)輸入字符串"Hello world!"到字符數(shù)組str,但字符數(shù)組并沒(méi)有接收字符串中間空格之后的數(shù)據(jù),說(shuō)明 scanf() 在碰到空格就停止讀取了
3.sizeof()函數(shù)計(jì)算字符串尺寸,strlen()函數(shù)計(jì)算字符串長(zhǎng)度
strlen() 特點(diǎn):僅以’\0’為結(jié)束判斷,且不將’\0’算入內(nèi)
sizeof 和 strlen 運(yùn)算符的返回類型可以用 %zd 轉(zhuǎn)換說(shuō)明
例子:
源代碼:
#include <stdio.h>
#include <string.h>
int main()
{
//sizeof():計(jì)算字符串尺寸
printf(" %zd\n", sizeof("abc")); //4
printf(" %zd\n", sizeof("")); //1
printf(" %zd\n", sizeof("abc\0de")); //7
printf(" %zd\n\n", sizeof("abc de")); //7
//strlen():計(jì)算字符串長(zhǎng)度
printf(" %zd\n", strlen("abc")); //3
printf(" %zd\n", strlen("")); //0
printf(" %zd\n", strlen("abc\0de")); //3;計(jì)算字符串長(zhǎng)度遇到第一個(gè)'\0'截止
printf(" %zd\n", strlen("abc de")); //6
return 0;
}
運(yùn)行結(jié)果:
4.字符數(shù)組定義和初始化
(1)傳統(tǒng)的字符集合賦值(不推薦)
char str1[5]={'a','b','c','d','e'}; //全部賦值
char str2[5]={'a','b','c'}; //部分元素賦值
char str3[]={'a','b','c','d','e'}; //省略數(shù)組長(zhǎng)度賦值
那么,上面三個(gè)字符數(shù)組中存放的是字符串嗎?
char str1[5]={'a','b','c','d','e'}; //不是字符串
char str2[5]={'a','b','c'}; //未賦值的元素為'\0',因此是字符串
char str3[]={'a','b','c','d','e'};
//省略數(shù)組長(zhǎng)度賦值,長(zhǎng)度根據(jù)字符的個(gè)數(shù)確定,不會(huì)自動(dòng)補(bǔ)充'\0',因此不是字符串
數(shù)組內(nèi)存中沒(méi)有’\0’就不是字符串
注意省略數(shù)組長(zhǎng)度賦值的情況,長(zhǎng)度根據(jù)字符的個(gè)數(shù)確定,不會(huì)自動(dòng)補(bǔ)充’\0’
總結(jié):用字符集合的方式賦值時(shí),養(yǎng)成習(xí)慣在末尾補(bǔ)充’\0’否則不是字符串文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-679835.html
(2)字符串整體賦值
char str1[5]="abcd";//系統(tǒng)會(huì)自動(dòng)在后面加'\0',即 ch[4]='\0'
char str2[3]="abcde";//錯(cuò)誤,超出數(shù)組的長(zhǎng)度
char str3[5]="abcde";//錯(cuò)誤,超出數(shù)組長(zhǎng)度
char str4[]="abc";
//推薦,系統(tǒng)會(huì)自動(dòng)在后面加'\0',即 a[3]='\0',所以該數(shù)組的元素個(gè)數(shù)是 4 個(gè)
(3)字符指針
char* str = "Hello world!";
printf("%s\n", str);
二、打印輸出字符串的三種方式
? 輸入和輸出必須給出字符串的首地址,可以直接是字符串常量、字符數(shù)組名,或者字符指針變量名文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-679835.html
1.直接是字符串常量
printf("%s\n", "Hello world");
2.字符數(shù)組名
char str[]="Hello world";//字符數(shù)組名str即為字符串首地址
printf("%s\n",str);//注意打印字符串要用%s
3.字符指針變量名
char * ps1="Hello world";
printf("%s\n",ps1);
//字符串常量"Hello world"的首地址賦給字符指針變量 ps1,使 ps1 指向字符串首元素地址
char str[]="Hello world" ;
char *ps2=NULL;
ps2 = str;//數(shù)組名 str 即字符串常量首元素地址,賦給字符指針變量 ps2
printf("%s\n",ps2);
到了這里,關(guān)于C語(yǔ)言——字符串、打印字符串的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!