C語(yǔ)言數(shù)據(jù)類(lèi)型和變量使用及說(shuō)明
一、數(shù)據(jù)類(lèi)型介紹
所謂“類(lèi)型”,就是相似的數(shù)據(jù)所擁有的共同特征,編譯器只有知道了數(shù)據(jù)的類(lèi)型,才知道怎么操作 數(shù)據(jù)。
使用整型類(lèi)型來(lái)描述整數(shù),使用字符類(lèi)型來(lái)描述字符,使用浮點(diǎn)型類(lèi)型來(lái)描述小數(shù)。
C語(yǔ)言的數(shù)據(jù)類(lèi)型有倆種:內(nèi)置類(lèi)型和自定義類(lèi)型:
- 內(nèi)置類(lèi)型:字符型、整型、浮點(diǎn)型、布爾類(lèi)型
- 自定義類(lèi)型:數(shù)組、結(jié)構(gòu)體-struct、枚舉-enum、聯(lián)合體-union
1.1字符型
字符的英文單詞是 character ,在C語(yǔ)言中使用 char 表示字符類(lèi)型。
char //character signed char; //有符號(hào)的 unsigned char; //無(wú)符號(hào)的
1.2整型
整數(shù)的英文單詞是 integer ,在C語(yǔ)言中使用 int 表示整型類(lèi)型。
//短整型 short [int] [signed] short [int] unsigned short [int] //整型 int [signed] int unsigned int //?整型 long [int] [signed] long [int] unsigned long [int] //更?的整型 //C99中引? long long [int] [signed] long long [int] unsigned long long [int]
1.3浮點(diǎn)型
float //單精度浮點(diǎn)型 double //雙精度浮點(diǎn)型 long double //更高精度
1.4布爾類(lèi)型
在C99中引入的布爾類(lèi)型專(zhuān)門(mén)表示真假
布爾類(lèi)型的使用需要包含頭文件<stdbool.h>
布爾類(lèi)型變量的取值是:true或false
define bool _Bool
#define false 0
#define true 1
演示:
_Bool flag = true;
if (flag)
printf("i like C\n");
1.5各種數(shù)據(jù)類(lèi)型的長(zhǎng)度
每?種數(shù)據(jù)類(lèi)型都有自己的長(zhǎng)度,使?不同的數(shù)據(jù)類(lèi)型,能夠創(chuàng)建出長(zhǎng)度不同的變量,變量長(zhǎng)度的不 同,存儲(chǔ)的數(shù)據(jù)范圍就有所差異。
1.5.1 sizeof操作符
sizeof 是?個(gè)關(guān)鍵字,也是操作符,專(zhuān)門(mén)是用來(lái)計(jì)算 sizeof 的操作符數(shù)的類(lèi)型長(zhǎng)度的,單位是字節(jié)。 sizeof 操作符的操作數(shù)可以是類(lèi)型,也可是變量或者表達(dá)式。
sizeof ( 類(lèi)型 ) sizeof 表達(dá)式
sizeof 的操作數(shù)如果不是類(lèi)型,是表達(dá)式的時(shí)候,可以省略掉后邊的括號(hào)的。
sizeof 后邊的表達(dá)式是不真實(shí)參與運(yùn)算的,根據(jù)表達(dá)式的類(lèi)型來(lái)得出大小。
sizeof 的計(jì)算結(jié)果是 size_t 類(lèi)型的。C語(yǔ)言創(chuàng)造了?個(gè)類(lèi)型別名 size_t ,用來(lái)統(tǒng)?表示 sizeof 的返回值類(lèi)型。對(duì)應(yīng)當(dāng)前系統(tǒng)的 sizeof 的返回值類(lèi)型,可能是 unsigned int ,也可能是 unsigned long long 。
#include <stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a ); //a是變量的名字,可以省略掉sizeof后邊的()
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}
1.5.2 數(shù)據(jù)類(lèi)型長(zhǎng)度
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char)); 輸出1
printf("%zd\n", sizeof(_Bool)); 輸出1
printf("%zd\n", sizeof(short)); 輸出2
printf("%zd\n", sizeof(int)); 輸出4
printf("%zd\n", sizeof(long)); 輸出4
printf("%zd\n", sizeof(long long)); 輸出8
printf("%zd\n", sizeof(float)); 輸出4
printf("%zd\n", sizeof(double)); 輸出8
printf("%zd\n", sizeof(long double)); 在VS上輸出8,在gcc上輸出16
return 0;
}
1.5.3 sizeof中表達(dá)式不計(jì)算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}
sizeof 在代碼進(jìn)行編譯的時(shí)候,就根據(jù)表達(dá)式的結(jié)果的類(lèi)型,推到并確定了類(lèi)型的長(zhǎng)度,而表達(dá)式 真要被執(zhí)行,卻要在程序運(yùn)行期間才會(huì)發(fā)生,如果在編譯期間已經(jīng)將 sizeof 處理掉了,所以在運(yùn)行期間就不會(huì)執(zhí)行表達(dá)式了。
二、signed和unsigned
C語(yǔ)言使用signed 和 unsigned 關(guān)鍵字修飾字符型和整型類(lèi)型的。
signed 關(guān)鍵字,表示?個(gè)類(lèi)型帶有正負(fù)號(hào),包含負(fù)值; unsigned 關(guān)鍵字,表示該類(lèi)型不帶有正負(fù)號(hào),只能表示零和正整數(shù)。
如:
對(duì)于 int 類(lèi)型,默認(rèn)是帶有正負(fù)號(hào)的,也就是說(shuō) int 等同于 signed int 。
由于這是默認(rèn)情況,關(guān)鍵字 signed ?般都省略不寫(xiě),但是寫(xiě)了也不算錯(cuò)。
int 類(lèi)型也可以不帶正負(fù)號(hào),只表示非負(fù)整數(shù)。這時(shí)就必須使用關(guān)鍵字 unsigned 聲明變量。
unsigned int 里面的 int 可以省略,所以 unsigned int a 也可以寫(xiě)成 unsiged a 。
但是 char 不等同于 signed char,它可能是signed char,也可能是unsigned char 。
三、數(shù)據(jù)類(lèi)型的取值范圍
每?種數(shù)據(jù)類(lèi)型有自己的取值范圍,也就是存儲(chǔ)的數(shù)值的最大值和最小值的區(qū)間
某種整數(shù)類(lèi)型的極限值,應(yīng)該盡量使用這些常量。
- SCHAR_MIN , SCHAR_MAX :signed char 的最小值和最大值。
- SHRT_MIN , SHRT_MAX :short 的最小值和最大值。
- INT_MIN , INT_MAX :int 的最小值和最大值。
- LONG_MIN , LONG_MAX :long 的最小值和最大值。
- LLONG_MIN , LLONG_MAX :long long 的最小值和最大值。
- UCHAR_MAX :unsigned char 的最大。
- USHRT_MAX :unsigned short 的最大值。
- UINT_MAX :unsigned int 的最大值。
- ULONG_MAX :unsigned long 的最大值。
- ULLONG_MAX :unsigned long long 的最大值。
四、變量
4.1 變量的創(chuàng)建
類(lèi)型是干什么的?類(lèi)型是創(chuàng)建變量的
那變量是什么呢?變量是經(jīng)常變化的量
不變的量稱(chēng)為常量
變量創(chuàng)建的語(yǔ)法形式如下:
my_student name; 數(shù)據(jù)類(lèi)型 變量名
變量命名的?般規(guī)則:
- 只能由字母(包括大寫(xiě)和小寫(xiě))、數(shù)字和下劃線(xiàn)(` _ `)組成。
- 不能以數(shù)字開(kāi)頭。
- 長(zhǎng)度不能超過(guò)63個(gè)字符。
- 變量名中區(qū)分大小寫(xiě)的。
- 變量名不能使用關(guān)鍵字。
int age; //整型變量 char ch; //字符變量 double weight; //浮點(diǎn)型變量
變量在創(chuàng)建的時(shí)候就給一個(gè)初始值,為初始化
int age = 18; char ch = 'h'; double weight = 45.0; unsigned int height = 90;
4.2 變量的分類(lèi)
- 全局變量:在大括號(hào)外部定義的變量就是全局變量全局變量的使用范圍更廣,整個(gè)代碼中想使用,都是有辦法使用的。
- 局部變量:在大括號(hào)內(nèi)部定義的變量就是局部變量局部變量的使用范圍是比較局限,只能在自己所在的局部范圍內(nèi)使用的。
#include <stdio.h>
int time = 2026; //全局變量
int main()
{
int last = 2025; //局部變量
printf("%d\n", time);
printf("%d\n", last);
return 0;
}
當(dāng)全局變量和局部變量的名字相同時(shí),局部變量?jī)?yōu)先使用
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n", n);//打印出10
return 0;
}
全局變量和局部變量在內(nèi)存中存儲(chǔ)在哪里?
內(nèi)存中有三個(gè)區(qū)域:棧區(qū)、堆區(qū)、靜態(tài)區(qū)。
- 1. 局部變量是放在內(nèi)存的棧區(qū)
- 2. 全局變量是放在內(nèi)存的靜態(tài)區(qū)
- 3. 堆區(qū)是用來(lái)動(dòng)態(tài)內(nèi)存管理的

五、 算術(shù)操作符(運(yùn)算符):+、-、*、/、%
5.1 + 和 -
位于操作符倆端的就是它們的操作數(shù),這種操作符也叫雙目操作符
#include <stdio.h>
int main()
{
int x = 4 + 18;
int y = 32 - 23;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}5.2 *
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 輸出 25
return 0;
}
5.3 /
除號(hào)的兩端如果是整數(shù),執(zhí)行的是整數(shù)除法,得到的結(jié)果也是整數(shù)。
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x); // 輸出 1.000000
printf("%d\n", y); // 輸出 1
return 0;
}
倆個(gè)運(yùn)算數(shù)至少有一個(gè)是浮點(diǎn)數(shù)時(shí),進(jìn)行浮點(diǎn)數(shù)除法,得到浮點(diǎn)數(shù)的結(jié)果
#include <stdio.h>
int main()
{
float x = 6.0 / 4; // 或者寫(xiě)成 6 / 4.0
printf("%f\n", x); // 輸出 1.500000
return 0;
}
5.4 %
運(yùn)算符 % 表示模(余)運(yùn)算,即返回兩個(gè)整數(shù)相除的余值。這個(gè)運(yùn)算符只用于整數(shù),不能用于浮點(diǎn) 數(shù)。
#include <stdio.h>
int main()
{
int x = 6 % 4;
printf("%d",x); //輸出2
return 0;
}
負(fù)數(shù)求模的結(jié)果的正負(fù)號(hào)由第?個(gè)運(yùn)算數(shù)的正負(fù)號(hào)決定。
#include <stdio.h>
int main()
{
printf("%d\n", 11 % -5); // 1
printf("%d\n",-11 % -5); // -1
printf("%d\n",-11 % 5); // -1
return 0;
}
六、 賦值操作符:=和復(fù)合賦值
在變量創(chuàng)建的時(shí)候給?個(gè)初始值叫初始化,在變量創(chuàng)建好后,再給?個(gè)值,就是賦值。
int a = 100; //初始化 a = 200; //賦值,這? = 就是賦值操作符
賦值操作符 = 是?個(gè)隨時(shí)可以給變量賦值的操作符。
6.1 連續(xù)賦值
int a = 3; int b = 4; int c = 8; c = b = a+3; //連續(xù)賦值,從右向左依次賦值的。
C語(yǔ)言雖然支持連續(xù)賦值,但是代碼不易理解,建議拆開(kāi)來(lái)寫(xiě)。
int a = 3; int b = 4; int c = 8; b = a + 3; c = b;
6.2 復(fù)合賦值符
復(fù)合賦值法即對(duì)?個(gè)數(shù)進(jìn)行自增、自減的操作。
int a = 18; a = a+3; a = a-2; 也可以寫(xiě)成: a += 3; a -= 2;
C語(yǔ)言中常見(jiàn)的復(fù)合賦值符如下:
+= -=
*= /= %=
>>= <<=
&= |= ^=
七、 單目操作符:++、--、+、-
7.1 ++和--
++是?種自增的操作符,分為前置++和后置++,--是?種自減的操作符,也分為前置--和后置--
7.1.1 前置++(前置--)
先+1(-1),后使用
int a = 10;
int b = ++a; //++的操作數(shù)是a,是放在a的前?的,就是前置++
//a+1后變成11,在使用就是賦值給b,所以a b均為11
printf("a=%d b=%d\n",a , b); 輸出 11 11
int a = 10;
int b = --a; //--的操作數(shù)是a,是放在a的前?的,就是前置--
printf("a=%d b=%d\n",a , b); //輸出的結(jié)果是:9 9
7.1.2 后置++(后置--)
先使用,后+1(-1)
int a = 10;
int b = a++; //++的操作數(shù)是a,是放在a的后?的,就是后置++
//先使用a,就是先賦值給b,b得到10,然后再+1,a變成11
printf("a=%d b=%d\n",a , b); //輸出 11 10
int a = 10;
int b = a--; //--的操作數(shù)是a,是放在a的后?的,就是后置--
printf("a=%d b=%d\n",a , b); //輸出的結(jié)果是:9 10
7.2 + 和 -
+ 是正號(hào),- 是負(fù)號(hào),都是單目操作符
運(yùn)算符 + 對(duì)正負(fù)值沒(méi)有影響,是?個(gè)完全可以省略的運(yùn)算符,但是寫(xiě)了也不會(huì)報(bào)錯(cuò)。
運(yùn)算符 - 用來(lái)改變?個(gè)值的正負(fù)號(hào),負(fù)數(shù)的前面加上 - 就會(huì)得到正數(shù),正數(shù)的前面加上 - 會(huì)得到負(fù) 數(shù)。
int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c); //b和c都是-10
int a = -10;
int b = -a;
printf("b=%d\n", b); //b是10
八、強(qiáng)制類(lèi)型轉(zhuǎn)換
int a = 3.14; //a的是int類(lèi)型, 3.14是double類(lèi)型,兩邊的類(lèi)型不?致,編譯器會(huì)報(bào)警告 int a = (int)3.14; //意思是將3.14強(qiáng)制類(lèi)型轉(zhuǎn)換為int類(lèi)型,這種強(qiáng)制類(lèi)型轉(zhuǎn)換只取整數(shù)部分
一般情況下,不使用強(qiáng)制類(lèi)型轉(zhuǎn)化實(shí)現(xiàn)代碼
萬(wàn)不得已情況下,才使用強(qiáng)制類(lèi)型轉(zhuǎn)化
九、printf 和 scanf 介紹
9.1 printf
9.1.1 基本用法
printf() 的作用是將參數(shù)文本輸出到屏幕
printf() 不會(huì)在行尾自動(dòng)添加換行符,運(yùn)行結(jié)束后,光標(biāo)就停留在輸出結(jié)束的地方,不會(huì)自動(dòng)換 行。
在輸出文本的末尾,添加換行符 \n ,使光標(biāo)移到下一行的開(kāi)頭。
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
int main()
{
printf("Hello World\n");
return 0;
}printf() 是在標(biāo)準(zhǔn)庫(kù)的頭文件 <stdio.h> 定義的。使用printf前,必須包含頭文件 <stdio.h> 。
9.1.2占位符
占位符,就是這個(gè)位置可以用其他值代入。
#include <stdio.h>
int main()
{
printf("There are %d boxes\n", 3);
//輸出There are 3 boxes
return 0;
}
%d 就是占位符,這個(gè)位置可以用其他值代替。
占位符的第二個(gè)字符表示占位的類(lèi)型,%d表示這里代入的必須是一個(gè)整數(shù),如上面中的3。
輸出的文本中可以使用多個(gè)占位符。
printf() 參數(shù)與占位符是一一對(duì)應(yīng)關(guān)系,如果有 n 個(gè)占位符, printf() 的參數(shù)就應(yīng)該有 n + 1 個(gè)。如果參數(shù)個(gè)數(shù)少于對(duì)應(yīng)的占位符, printf() 可能會(huì)輸出內(nèi)存中的任意值。
#include <stdio.h>
int main()
{
printf("%s says it is %d o'clock\n", "zhangsan", 18);
//有倆個(gè)占位符,第一個(gè)%s ,第二個(gè)%d
//分別對(duì)應(yīng) printf() 的第二個(gè)(zhangsan)和三個(gè)參數(shù)(18)
return 0;
}
9.1.3 占位符列舉
常見(jiàn)的占位符(加粗為常用的占位符):
- %a :十六進(jìn)制浮點(diǎn)數(shù),字母輸出為小寫(xiě)。
- %A :十六進(jìn)制浮點(diǎn)數(shù),字母輸出為大寫(xiě)。
- %c :字符。//char
- %d :十進(jìn)制整數(shù)(有符號(hào)的10進(jìn)制整數(shù))。// int
- %e :使用科學(xué)計(jì)數(shù)法的浮點(diǎn)數(shù),指數(shù)部分的 e 為小寫(xiě)。
- %E :使用科學(xué)計(jì)數(shù)法的浮點(diǎn)數(shù),指數(shù)部分的 E 為大寫(xiě)。
- %i :整數(shù),基本等同于 %d 。
- %f :小數(shù)(包含 float 類(lèi)型和 double 類(lèi)型)。//float %f double - %lf
- %g :6個(gè)有效數(shù)字的浮點(diǎn)數(shù)。整數(shù)部分?旦超過(guò)6位,就會(huì)自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法,指數(shù)部分的 e 為小寫(xiě)。
- %G :等同于 %g ,唯?的區(qū)別是指數(shù)部分的 E 為大寫(xiě)。
- %hd :十進(jìn)制 short int 類(lèi)型。
- %ho :八進(jìn)制 short int 類(lèi)型。
- %hx :十六進(jìn)制 short int 類(lèi)型。
- %hu :unsigned short int 類(lèi)型。
- %ld :十進(jìn)制 long int 類(lèi)型。
- %lo :八進(jìn)制 long int類(lèi)型。
- %lx :十六進(jìn)制 long int 類(lèi)型。
- %lu :unsigned long int 類(lèi)型。
- %lld :十進(jìn)制 long long int 類(lèi)型。
- %llo :八進(jìn)制 long long int 類(lèi)型。
- %llx :十六進(jìn)制 long long int 類(lèi)型。
- %llu :unsigned long long int 類(lèi)型。
- %le :科學(xué)計(jì)數(shù)法表示的 long double 類(lèi)型浮點(diǎn)數(shù)。
- %lf :long double 類(lèi)型浮點(diǎn)數(shù)。
- %n :已輸出的字符串?dāng)?shù)量。該占位符本身不輸出,只將值存儲(chǔ)在指定變量之中。
- %o :八進(jìn)制整數(shù)。
- %p :指針(用來(lái)打印地址)。
- %s :字符串。
- %u :無(wú)符號(hào)整數(shù)(unsigned int)。
- %x :十六進(jìn)制整數(shù)。
- %zd : size_t 類(lèi)型。
- %% :輸出?個(gè)百分號(hào)。
9.1.4 輸出格式
9.1.4.1限定寬度
printf() 允許限定占位符的最小寬度。
%5d 表示這個(gè)占位符的寬度至少為5位。如果不滿(mǎn)5位,對(duì)應(yīng)的值的前面會(huì)添加空格。輸出的值默認(rèn)右對(duì)齊;想輸出左對(duì)齊時(shí),在%后面加 - ,即 %-5d
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 輸出為 " 123"
printf("%-5d\n", 123); // 輸出為 "123 "
return 0;
}對(duì)于小數(shù),會(huì)限制所有數(shù)字的最小顯示寬度。
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45); //輸出" 123.450000"
return 0;
}
%12f 表示輸出的浮點(diǎn)數(shù)最少要占據(jù)12位。由于小數(shù)的默認(rèn)顯示精度為小數(shù)點(diǎn)后6位, 所以 123.45 輸出結(jié)果的頭部會(huì)添加2個(gè)空格。
9.1.4.2 限定小數(shù)位數(shù)
當(dāng)限定小數(shù)位數(shù)為2時(shí),占位符可寫(xiě)為%.2f
#include <stdio.h>
int main()
{
printf("%.2f\n", 0.5); //輸出"0.50"
return 0;
}
與限定寬度結(jié)合使用時(shí)
#include <stdio.h>
int main()
{
printf("%5.2f\n", 0.5); //輸出" 0.50"
return 0;
}
最小寬度和小數(shù)位數(shù)都可以用 * 表示
#include <stdio.h>
int main()
{
printf("%*.*f\n", 5, 2, 0.5);
// 同于printf("%5.2f\n", 0.5);
return 0;
}
9.1.4.3 輸出部分字符串
%s 占位符用來(lái)輸出字符串,默認(rèn)是全部輸出。如果只想輸出開(kāi)頭的部分,可以用 %.ns 指定輸出 的長(zhǎng)度,其中 n 代表?個(gè)數(shù)字,表示所要輸出的長(zhǎng)度。
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world"); //,只輸出前五個(gè),"hello"
return 0;
}
9.2 scanf
當(dāng)我們需要在屏幕上輸入時(shí),就可以用 scanf 函數(shù)
#include <stdio.h>
int main()
{
int amount = 0;
printf("請(qǐng)輸?金額:");
scanf("%d", &amount);
printf("金額是:%d\n", amount);
return 0;
}
運(yùn)行之后是:
請(qǐng)輸入金額:5
金額是:5
9.2.1 基本用法
scanf() 函數(shù)用于讀取用戶(hù)的鍵盤(pán)輸入。
程序運(yùn)行到這個(gè)語(yǔ)句時(shí),會(huì)停下來(lái),等待用戶(hù)從鍵盤(pán)輸入。
用戶(hù)輸入數(shù)據(jù)、按下回車(chē)鍵后, scanf() 就會(huì)處理用戶(hù)的輸入,將其存入變量。
它定義在頭文件 <stdio.h> 中 。
scanf() 的語(yǔ)法跟 printf() 類(lèi)似。
int i = 0;
scanf("%d", &i);
%d 占位符與 printf 基本類(lèi)似,告訴編譯器輸入的類(lèi)型
&i 表示用戶(hù)從鍵盤(pán)輸入的整數(shù)存入變量 i 。
變量 i 前必須加上 &(指針變量除外),scanf傳遞的是地址,不是值,scanf將變量 i 的地址指向用戶(hù)輸入的值。
變量是指針變量時(shí),不需要&。
scanf("%d%d%f%f", &x, &y, &a, &b);
//前兩個(gè)用戶(hù)輸入的是整數(shù),后兩個(gè)是浮點(diǎn)數(shù)(小數(shù)),依次放入x,y,a,b。
scanf() 處理數(shù)值占位符時(shí),會(huì)自動(dòng)過(guò)濾空白字符,包括空格、制表符、換行符等
所以用戶(hù)輸入的數(shù)據(jù)之間有空格、使用回車(chē)鍵不影響 scanf 解讀輸入數(shù)據(jù)
但是使用回車(chē)鍵時(shí),每次按下回車(chē)鍵以后, scanf() 就會(huì)開(kāi)始解讀,如果第?行匹配第?個(gè)占位符,那么下次按下回車(chē)鍵時(shí),就會(huì)從第?個(gè)占位符開(kāi)始解讀。
scanf() 處理用戶(hù)輸入的原理是,用戶(hù)的輸入先放入緩存,等到按下回車(chē)鍵后,按照占位符對(duì)緩存 進(jìn)行解讀。
解讀用戶(hù)輸入時(shí),會(huì)從上?次解讀遺留的第?個(gè)字符開(kāi)始,直到讀完緩存,或者遇到第?個(gè)不符合條件的字符為止。
#include <stdio.h>
int main()
{
int x;
float y;
// 輸入 " 123.45# 0"
scanf("%d%f", &x, &y);
return 0;
}
scanf() 讀取用戶(hù)輸入時(shí), %d 占位符會(huì)忽略空格,從 1 處開(kāi)始獲取數(shù)據(jù),讀到 3 停下來(lái),因?yàn)楹?的 . 不屬于整數(shù)的有效字符。就是 %d 會(huì)讀到123。
第二次調(diào)用時(shí),scanf() 就會(huì)從上?次停止解讀的地方,繼續(xù)往下讀取。這?次讀取的收字符是 . ,由于對(duì)應(yīng)的占位符是 %f ,會(huì)讀取到 .45。后面的 # 不屬于浮點(diǎn)數(shù)的有效字符,所以會(huì)停在這?。
9.2.2 scanf 的返回值
scanf() 的返回值是?個(gè)整數(shù),表示成功讀取的變量個(gè)數(shù)。
如果沒(méi)有讀取任何項(xiàng),或者匹配失敗,則返回 0 。
如果在成功讀取任何數(shù)據(jù)之前,發(fā)生了讀取錯(cuò)誤或者遇到讀取到文件結(jié)尾,則返回常量 EOF(-1)。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int x = scanf("%d %d %f", &a, &b, &f); //輸入 1 2 3.45 x輸出3
printf("a=%d b=%d f=%f\n", a, b, f) //輸入 1 2 3 x輸出3,f的值是3.0000
printf("x = %d\n", x); //輸入 1 ,2 3.45 x輸出1,只成功讀取a
return 0; //輸入 1.1 2 3.14 x輸出0,解析第一個(gè)失敗
}
9.2.3 占位符
scanf() 常用的占位符,與 printf() 的占位符基本?致,使用時(shí)也基本一致。
在使用占位符時(shí),除 %c 以外,會(huì)自動(dòng)忽略空白字符,如果要強(qiáng)制忽略,在使用%c時(shí),在%c前面加空格,scanf(" %c", &ch)。
%s ,它不能簡(jiǎn)單地等同于字符串。它從第?個(gè)非空白字符開(kāi)始讀起,直到遇到空白字符(即空格、換行符、制表符等)為止。%s 不會(huì)包含空白字符,所以無(wú)法用來(lái)讀取多個(gè)單詞。scanf() 遇到 %s 占位符時(shí),會(huì)在字符串變量末尾存儲(chǔ)?個(gè)空字符 \0 。
9.2.4 賦值忽略符
* 加在任何占位符的百分號(hào)后面,該占位符就不會(huì)返回值,解析后將被丟棄。
scanf("%d%*c%d%*c%d", &year, &month, &day);
//輸入 2026-1-16 時(shí)-會(huì)被丟棄%*c 就是在占位符的百分號(hào)后面,加入了賦值忽略符 * ,表示這個(gè)占位符沒(méi)有對(duì)應(yīng)的變量,解讀后不必返回。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Qt優(yōu)雅實(shí)現(xiàn)線(xiàn)程安全單例模式(模板化和自動(dòng)清理)
在 Qt 開(kāi)發(fā)中,單例模式是高頻使用的設(shè)計(jì)模式,本文將基于模板封裝 + 管理器的設(shè)計(jì)思路,實(shí)現(xiàn)一套可直接復(fù)用的單例框架,并詳細(xì)講解其設(shè)計(jì)原理與最佳實(shí)踐,有需要的可以了解下2025-11-11
C/C++中的?Qt?StandardItemModel?數(shù)據(jù)模型應(yīng)用解析
QStandardItemModel?是標(biāo)準(zhǔn)的以項(xiàng)數(shù)據(jù)為單位的基于M/V模型的一種標(biāo)準(zhǔn)數(shù)據(jù)管理方式,本文給大家介紹C/C++中的?Qt?StandardItemModel?數(shù)據(jù)模型應(yīng)用解析,感興趣的朋友跟隨小編一起看看吧2021-12-12
C++中函數(shù)使用的基本知識(shí)學(xué)習(xí)教程
這篇文章主要介紹了C++中函數(shù)使用的基本知識(shí)學(xué)習(xí)教程,涵蓋了函數(shù)的聲明和參數(shù)以及指針等各個(gè)方面的知識(shí),非常全面,需要的朋友可以參考下2016-01-01
C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題
這篇文章主要介紹了C++調(diào)用C函數(shù)報(bào)錯(cuò)無(wú)法解析的外部命令/無(wú)法解析的外部符號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
C++11新特性之隨機(jī)數(shù)庫(kù)(Random?Number?Library)詳解
相對(duì)于C++11之前的隨機(jī)數(shù)生成器來(lái)說(shuō),C++11的隨機(jī)數(shù)生成器是復(fù)雜了很多,下面這篇文章主要給大家介紹了關(guān)于C++11新特性之隨機(jī)數(shù)庫(kù)(Random?Number?Library)的相關(guān)資料,需要的朋友可以參考下2022-06-06
C++淺析數(shù)據(jù)在內(nèi)存中如何存儲(chǔ)
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-08-08

