c語言所有用法,c語言用法用法

本文目錄一覽:

c語言函數用法

char

s1[]=”abcdef”,s2=”bcdf”;

應改為:char

s1[]=”abcdef”,s2[]=”bcdf”;

上次就說了,for語句下面只能包括一條語句(IF表達式,while,for,do

while等)如果要包括多個要用{}括起來

for(i=0;s2[i];i++)

s1[i]=s2[i];

功能是將s2的字符依次複製到S1中,也就是取代S1所有的值,

因為字符串是以’\0’結束的,(也可以用0表示字符串結束符)

所以s1[i]=0;就表示s1[i]=’\0′;代表字符串已複製完畢,結束了

c語言位運算符的用法

c語言位運算符的用法1

c語言位運算符的用法如下:

一、位運算符C語言提供了六種位運算符:

按位與

| 按位或

^ 按位異或

~ 取反

左移

右移

1. 按位與運算

按位與運算符””是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。

例如:95可寫算式如下: 00001001 (9的二進制補碼)00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見95=1。

按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a255 運算 ( 255 的二進制數為0000000011111111)。

main(){

int a=9,b=5,c;

c=ab;

printf(“a=%d/nb=%d/nc=%d/n”,a,b,c);

}

2. 按位或運算

按位或運算符“|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。

例如:9|5可寫算式如下: 00001001|00000101

00001101 (十進制為13)可見9|5=13

main(){

int a=9,b=5,c;

c=a|b;

printf(“a=%d/nb=%d/nc=%d/n”,a,b,c);

}

3. 按位異或運算

按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)。

main(){

int a=9;

a=a^15;

printf(“a=%d/n”,a);

}

4. 求反運算

求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110。

5. 左移運算

左移運算符“”是雙目運算符。其功能把“ ”左邊的運算數的各二進位全部左移若干位,由“”右邊的數指定移動的位數,高位丟棄,低位補0。例如: a4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。

6. 右移運算

右移運算符“”是雙目運算符。其功能是把“ ”左邊的運算數的`各二進位全部右移若干位,“”右邊的數指定移動的位數。

例如:設 a=15,a2 表示把000001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。

main(){

unsigned a,b;

printf(“input a number: “);

scanf(“%d”,a);

b=a5;

b=b15;

printf(“a=%d/tb=%d/n”,a,b);

}

請再看一例!

main(){

char a=’a’,b=’b’;

int p,c,d;

p=a;

p=(p8)|b;

d=p0xff;

c=(p0xff00)8;

printf(“a=%d/nb=%d/nc=%d/nd=%d/n”,a,b,c,d);

}

c語言位運算符的用法2

C語言位運算。所謂位運算,就是對一個比特(Bit)位進行操作。比特(Bit)是一個電子元器件,8個比特構成一個字節(Byte),它已經是粒度最小的可操作單元了。

C語言提供了六種位運算符:

按位與運算()

一個比特(Bit)位只有 0 和 1 兩個取值,只有參與運算的兩個位都為 1 時,結果才為 1,否則為 0。例如11為 1,00為 0,10也為 0,這和邏輯運算符非常類似。

C語言中不能直接使用二進制,兩邊的操作數可以是十進制、八進制、十六進制,它們在內存中最終都是以二進制形式存儲,就是對這些內存中的二進制位進行運算。其他的位運算符也是相同的道理。

例如,9 5可以轉換成如下的運算:

0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 0001 (1 在內存中的存儲)

也就是說,按位與運算會對參與運算的兩個數的所有二進制位進行運算,9 5的結果為 1。

又如,-9 5可以轉換成如下的運算:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

-9 5的結果是 5。

關於正數和負數在內存中的存儲形式,我們已在教程《整數在內存中是如何存儲的》中進行了講解。

再強調一遍,是根據內存中的二進制位進行運算的,而不是數據的二進制形式;其他位運算符也一樣。以-95為例,-9 的在內存中的存儲和 -9 的二進制形式截然不同:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

-0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (-9 的二進制形式,前面多餘的 0 可以抹掉)

按位與運算通常用來對某些位清 0,或者保留某些位。例如要把 n 的高 16 位清 0 ,保留低 16 位,可以進行n 0XFFFF運算(0XFFFF 在內存中的存儲形式為 0000 0000 — 0000 0000 — 1111 1111 — 1111 1111)。

【實例】對上面的分析進行檢驗。

00001. #include

00002.

00003. int main(){

00004. int n = 0X8FA6002D;

00005. printf(“%d, %d, %X “, 9 5, -9 5, n 0XFFFF);

00006. return 0;

00007. }

運行結果:

1, 5, 2D

按位或運算(|)

參與|運算的兩個二進制位有一個為 1 時,結果就為 1,兩個都為 0 時結果才為 0。例如1|1為1,0|0為0,1|0為1,這和邏輯運算中的||非常類似。

例如,9 | 5可以轉換成如下的運算:

0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

| 0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 1101 (13 在內存中的存儲)

9 | 5的結果為 13。

又如,-9 | 5可以轉換成如下的運算:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

| 0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

-9 | 5的結果是 -9。

按位或運算可以用來將某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以進行n | 0XFFFF0000運算(0XFFFF0000 在內存中的存儲形式為 1111 1111 — 1111 1111 — 0000 0000 — 0000 0000)。

【實例】對上面的分析進行校驗。

00001. #include

00002.

00003. int main(){

00004. int n = 0X2D;

00005. printf(“%d, %d, %X “, 9 | 5, -9 | 5, n | 0XFFFF0000);

00006. return 0;

00007. }

運行結果:

13, -9, FFFF002D

按位異或運算(^)

參與^運算兩個二進制位不同時,結果為 1,相同時結果為 0。例如0^1為1,0^0為0,1^1為0。

例如,9 ^ 5可以轉換成如下的運算:

0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

^ 0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 1100 (12 在內存中的存儲)

9 ^ 5的結果為 12。

又如,-9 ^ 5可以轉換成如下的運算:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

^ 0000 0000 — 0000 0000 — 0000 0000 — 0000 0101 (5 在內存中的存儲)

———————————————————————————–

1111 1111 — 1111 1111 — 1111 1111 — 1111 0010 (-14 在內存中的存儲)

-9 ^ 5的結果是 -14。

按位異或運算可以用來將某些二進制位反轉。例如要把 n 的高 16 位反轉,保留低 16 位,可以進行n ^ 0XFFFF0000運算(0XFFFF0000 在內存中的存儲形式為 1111 1111 — 1111 1111 — 0000 0000 — 0000 0000)。

【實例】對上面的分析進行校驗。

00001. #include

00002.

00003. int main(){

00004. unsigned n = 0X0A07002D;

00005. printf(“%d, %d, %X “, 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);

00006. return 0;

00007. }

運行結果:

12, -14, F5F8002D

取反運算(~)

取反運算符~為單目運算符,右結合性,作用是對參與運算的二進制位取反。例如~1為0,~0為1,這和邏輯運算中的!非常類似。。

例如,~9可以轉換為如下的運算:

~ 0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

———————————————————————————–

1111 1111 — 1111 1111 — 1111 1111 — 1111 0110 (-10 在內存中的存儲)

所以~9的結果為 -10。

例如,~-9可以轉換為如下的運算:

~ 1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 1000 (9 在內存中的存儲)

所以~-9的結果為 8。

【實例】對上面的分析進行校驗。

00001. #include

00002.

00003. int main(){

00004. printf(“%d, %d “, ~9, ~-9 );

00005. return 0;

00006. }

運行結果:

-10, 8

左移運算()

左移運算符用來把操作數的各個二進制位全部左移若干位,高位丟棄,低位補0。

例如,93可以轉換為如下的運算:

0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0100 1000 (72 在內存中的存儲)

所以93的結果為 72。

又如,(-9)3可以轉換為如下的運算:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

———————————————————————————–

1111 1111 — 1111 1111 — 1111 1111 — 1011 1000 (-72 在內存中的存儲)

所以(-9)3的結果為 -72

如果數據較小,被丟棄的高位不包含 1,那麼左移 n 位相當於乘以 2 的 n 次方。

【實例】對上面的結果進行校驗。

00001. #include

00002.

00003. int main(){

00004. printf(“%d, %d “, 93, (-9)3 );

00005. return 0;

00006. }

運行結果:

72, -72

右移運算()

右移運算符用來把操作數的各個二進制位全部右移若干位,低位丟棄,高位補 0 或 1。如果數據的最高位是 0,那麼就補 0;如果最高位是 1,那麼就補 1。

例如,93可以轉換為如下的運算:

0000 0000 — 0000 0000 — 0000 0000 — 0000 1001 (9 在內存中的存儲)

———————————————————————————–

0000 0000 — 0000 0000 — 0000 0000 — 0000 0001 (1 在內存中的存儲)

所以93的結果為 1。

又如,(-9)3可以轉換為如下的運算:

1111 1111 — 1111 1111 — 1111 1111 — 1111 0111 (-9 在內存中的存儲)

———————————————————————————–

1111 1111 — 1111 1111 — 1111 1111 — 1111 1110 (-2 在內存中的存儲)

所以(-9)3的結果為 -2

如果被丟棄的低位不包含 1,那麼右移 n 位相當於除以 2 的 n 次方(但被移除的位中經常會包含 1)。

【實例】對上面的結果進行校驗。

00001. #include

00002.

00003. int main(){

00004. printf(“%d, %d “, 93, (-9)3 );

00005. return 0;

00006. }

運行結果:

1, -2

c語言位運算符的用法3

一、位運算符

在計算機中,數據都是以二進制數形式存放的,位運算就是指對存儲單元中二進制位的運算。C語言提供6種位運算符。

二、位運算

位運算符 |~ ∧ 按優先級從高到低排列的順序是:

位運算符中求反運算“~“優先級最高,而左移和右移相同,居於第二,接下來的順序是按位與 ““、按位異或 “∧“和按位或 “|“。順序為~ ∧ | 。

例1:左移運算符“”是雙目運算符。其功能把“ ”左邊的運算數的各二進位全部左移若干位,由“”右邊的數指定移動的位數,高位丟棄,低位補0。

例如:

a4

指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。

例2:右移運算符“”是雙目運算符。其功能是把“ ”左邊的運算數的各二進位全部右移若干位,“”右邊的數指定移動的位數。

例如:

設 a=15,

a2

表示把000001111右移為00000011(十進制3)。

應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。

例3:設二進制數a是00101101 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則二進制數b是。

解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變量。

如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實現:

a=a∧b;

b=b∧a;

a=a∧b;

所以本題的答案為: 11110000 。

C語言中char的用法

#includestdio。h

intmain()

{

inti;

charc;//定義一個char類型的變量。

c=’a’;//賦值

for(i=0;i26;i++){

printf(“%c”,c);//輸出一個字符用%c,

c++;//charc增加1,依次可以得到:abcdef。。。。z

}

printf(“\n”);

if(c=’z’)

printf(“stillasmallletter。\n”);

else

printf(“Notasmallletter。\n”);

scanf(“%c”,c);//輸入一個字符到c中。

charstr[10]=“AString”;//定義一個字符數組,它的初值是“AString”

for(i=0;str[i]!=’\0’;i++);//計算str的長度。

printf(“Thelengthofstris:%d\n”,i);

}

擴展資料

1、聲明字符型變量

字符型變量的聲明方式和其它類型變量的聲明方式一樣:

chargood;

charbetter,best;

以上代碼聲明了三個字符型變量:good、better,和best。

2、字符常量與初始化

可以使用以下語句來初始化字符型變量:

charch=’A’;

這個語句把ch的值初始化為A的編碼值。在這個語句中,’A’是字符常量。C語言中,使用單引號把字符引|起來就構成字符常量。

c語言string的用法大全

C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C 語言string的用法有哪些呢,請看看下面我為你整理 總結 的c語言string的用法大全_C語言中string使用 方法 。

c語言string的用法

函數原型:char *strdup(const char *s)

函數功能:字符串拷貝,目的空間由該函數分配

函數返回:指向拷貝後的字符串指針

參數說明:src-待拷貝的源字符串

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

#includealloc.h

intmain()

{

char*dup_str,*string=”abcde”;

dup_str=strdup(string);

printf(“%s”,dup_str);

free(dup_str);

return0;

}

@函數名稱:strcpy

函數原型:char* strcpy(char* str1,char* str2);

函數功能:把str2指向的字符串拷貝到str1中去

函數返回:返回str1,即指向str1的指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charstring[10];

char*str1=”abcdefghi”;

strcpy(string,str1);

printf(“thestringis:%s\n”,string);

return0;

}

@函數名稱:strncpy

函數原型:char *strncpy(char *dest, const char *src,intcount)

函數功能:將字符串src中的count個字符拷貝到字符串dest中去

函數返回:指向dest的指針

參數說明:dest-目的字符串,src-源字符串,count-拷貝的字符個數

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

char*src=”bbbbbbbbbbbbbbbbbbbb”;//20’b’s

chardest[50]=”aaaaaaaaaaaaaaaaaaaa”;//20’a’s

puts(dest);

strncpy(dest,src,10);

puts(dest);

return0;

}

輸出:

[cpp] view plain

/*******************************************

aaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbaaaaaaaaaa

*******************************************/

注意:strncpy只複製指定長度的字符,不會自動在末尾加’\0’。若指定長度超過源字符串長度,不夠的部分補‘\0’,

@函數名稱:strcat

函數原型:char* strcat(char * str1,char * str2);

函數功能:把字符串str2接到str1後面,str1最後的’\0’被取消

函數返回:str1

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charbuffer[80];

strcpy(buffer,”Hello”);

strcat(buffer,”world”);

printf(“%s\n”,buffer);

return0;

}

@函數名稱:strncat

函數原型:char *strncat(char *dest, const char *src, size_t maxlen)

函數功能:將字符串src中前maxlen個字符連接到dest中

函數返回:

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

charbuffer[80];

intmain()

{

strcpy(buffer,”Hello”);

strncat(buffer,”world”,8);

printf(“%s\n”,buffer);

strncat(buffer,”*************”,4);

printf(“%s\n”,buffer);

return0;

}

注意:與strncpy不同的是,strncat會自動在末尾加‘\0’,若指定長度超過源字符串長度,則只複製源字符串長度即停止

@函數名稱:strcmp

函數原型:int strcmp(char * str1,char * str2);

函數功能:比較兩個字符串str1,str2.

函數返回:str1str2,返回負數;str1=str2,返回 0;str1str2,返回正數.

參數說明:

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

char*buf1=”aaa”,*buf2=”bbb”,*buf3=”ccc”;

intptr;

ptr=strcmp(buf2,buf1);

if(ptr0)

printf(“buffer2isgreaterthanbuffer1\n”);

else

printf(“buffer2islessthanbuffer1\n”);

ptr=strcmp(buf2,buf3);

if(ptr0)

printf(“buffer2isgreaterthanbuffer3\n”);

else

printf(“buffer2islessthanbuffer3\n”);

return0;

}

@函數名稱:strncmp

函數原型:int strncmp(char *str1,char *str2,int count)

函數功能:對str1和str2中的前count個字符按字典順序比較

函數返回:小於0:str1str2,等於0:str1=str2,大於0:str1str2

參數說明:str1,str2-待比較的字符串,count-比較的長度

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

charstr1[]=”aabbc”;//

charstr2[]=”abbcd”;//

//為使測試程序更簡練,此處假定了strncmp只返回-1,0,1三個數

charres_info[]={”,’=’,”};

intres;

//前1個字符比較

res=strncmp(str1,str2,1);

printf(“1:str1%cstr2\n”,res_info[res+1]);

//前3個字符比較

res=strncmp(str1,str2,3);

printf(“3:str1%cstr2\n”,res_info[res+1]);

}

輸出:

[cpp] view plain

/****************************************

1:str1=str2

3:str1str2

*****************************************/

@函數名稱:strpbrk

函數原型:char *strpbrk(const char *s1, const char *s2)

函數功能:得到s1中第一個“同時也出現在s2中”字符的位置指針

函數返回:位置指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

char*p=”Findallvowels”;

p=strpbrk(p+1,”aeiouAEIOU”);

while(p)

{

printf(“%s\n”,p);

p=strpbrk(p+1,”aeiouAEIOU”);

}

return0;

}

輸出:

[cpp] view plain

/**************************************

indallvowels

allvowels

owels

els

**************************************/

@函數名稱:strcspn

函數原型:int strcspn(const char *s1, const char *s2)

函數功能:統計s1中從頭開始直到第一個“來自s2中的字符”出現的長度

函數返回:長度

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

printf(“%d\n”,strcspn(“abcbcadef”,”cba”));

printf(“%d\n”,strcspn(“xxxbcadef”,”cba”));

printf(“%d\n”,strcspn(“123456789″,”cba”));

return0;

}

輸出:

[cpp] view plain

/************************

3

9

************************/

@函數名稱:strspn

函數原型:int strspn(const char *s1, const char *s2)

函數功能:統計s1中從頭開始直到第一個“不來自s2中的字符”出現的長度

函數返回:位置指針

參數說明:

所屬文件:string.h

[html] view plain

#includestdio.h

#includestring.h

#includealloc.h

intmain()

{

printf(“%d\n”,strspn(“abcbcadef”,”cba”));

printf(“%d\n”,strspn(“xxxbcadef”,”cba”));

printf(“%d\n”,strspn(“123456789″,”cba”));

return0;

}

輸出:

[cpp] view plain

/************************

6

************************/

@函數名稱:strchr

函數原型:char* strchr(char* str,char ch);

函數功能:找出str指向的字符串中第一次出現字符ch的位置

函數返回:返回指向該位置的指針,如找不到,則返回空指針

參數說明:str-待搜索的字符串,ch-查找的字符

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

char*str=”Thisisastring!”;

charch;

char*p;

while(1)

{

printf(“Pleaseinputachar:”);

ch=getchar();

p=strchr(str,ch);

if(p)

printf(“%cisthe%dcharacterof\”%s\”\n”,ch,(int)(p-str+1),str);

else

printf(“Notfound!\n”);

printf(“PressESCtoquit!\n\n”);

if(27==getch())

break;

fflush(stdin);

}

return0;

}

運行結果:

[cpp] view plain

/********************************************

Pleaseinputachar:i

iisthe3characterof”Thisisastring!”

PressESCtoquit!

Pleaseinputachar:l

Notfound!

PressESCtoquit!

Pleaseinputachar:s

sisthe4characterof”Thisisastring!”

PressESCtoquit!

**********************************************/

@函數名稱:strrchr

函數原型:char *strrchr(const char *s, int c)

函數功能:得到字符串s中最後一個含有c字符的位置指針

函數返回:位置指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

charstring[15];

char*ptr,c=’r’;

strcpy(string,”Thisisastring”);

ptr=strrchr(string,c);

if(ptr)

printf(“Thecharacter%cisatposition:%d”,c,ptr-string);

else

printf(“Thecharacterwasnotfound”);

return0;

}

@函數名稱:strstr

函數原型:char* strstr(char* str1,char* str2);

函數功能:找出str2字符串在str1字符串中第一次出現的位置(不包括str2的串結束符)

函數返回:返回該位置的指針,如找不到,返回空指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

char*str1=”OpenWatcomC/C++”,*str2=”Watcom”,*ptr;

ptr=strstr(str1,str2);

printf(“Thesubstringis:%s\n”,ptr);

return0;

}

輸出:

The substringis:Watcom C/C++

@函數名稱:strrev

函數原型:char *strrev(char *s)

函數功能:將字符串中的所有字符顛倒次序排列

函數返回:指向s的指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

charforward[]=”string”;//原文中定義為char*是不對的,指向代碼段的指針內容是不可變的

printf(“Beforestrrev():%s”,forward);

strrev(forward);

printf(“Afterstrrev():%s”,forward);

return0;

}

輸出:

[cpp] view plain

/************************************

Beforestrrev():string

Afterstrrev():gnirts

************************************/

@函數名稱:strnset

函數原型:char *strnset(char *s, int ch, size_t n)

函數功能:將字符串s中前n個字符設置為ch的值

函數返回:指向s的指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charstring[]=”aaaaaaaaaaaaaaaaaaaaaaa”;

charletter=’x’;

printf(“stringbeforestrnset:%s\n”,string);

strnset(string,letter,10);

printf(“stringafterstrnset:%s\n”,string);

return0;

}

輸出:

[cpp] view plain

/*************************************************

stringbeforestrnset:aaaaaaaaaaaaaaaaaaaaaaa

stringafterstrnset:xxxxxxxxxxaaaaaaaaaaaaa

*************************************************/

@函數名稱:strset

函數原型:char *strset(char *s, int ch)

函數功能:將字符串s中所有字符設置為ch的值

函數返回:指向s的指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charstring[10]=”123456789″;

charsymbol=’c’;

printf(“Beforestrset():%s”,string);

strset(string,symbol);

printf(“Afterstrset():%s”,string);

return0;

}

@函數名稱:strtok

函數原型:char *strtok(char *s1, const char *s2)

函數功能:分解s1字符串為用特定分隔符分隔的多個字符串(一般用於將英文句分解為單詞)

函數返回:字符串s1中首次出現s2中的字符前的子字符串指針

參數說明:s2一般設置為s1中的分隔字符

規定進行子調用時(即分割s1的第二、三及後續子串)第一參數必須是NULL

在每一次匹配成功後,將s1中分割出的子串位置替換為NULL(摘下鏈中第一個環),因此s1被破壞了

函數會記憶指針位置以供下一次調用

所屬文件:string.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

char*p;

char*buffer;

char*delims={“.,”};

buffer=strdup(“Findwords,allofthem.”);

printf(“%s\n”,buffer);

p=strtok(buffer,delims);

while(p!=NULL){

printf(“word:%s\n”,p);

p=strtok(NULL,delims);

}

printf(“%s\n”,buffer);

return0;

}//根據測試,可以隨時給strtok的第一個參數輸入一個新的字符串,開始新字符串的分隔

PS:根據測試,可以隨時給strtok的第一個參數輸入一個新的字符串,開始新字符串的分隔

@函數名稱:strupr

函數原型:char *strupr(char *s)

函數功能:將字符串s中的字符變為大寫

函數返回:

參數說明:

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charstring[]=”abcdefghijklmnopqrstuvwxyz”,*ptr;//會影響原字符串的內存,用char[]來聲明

ptr=strupr(string);

printf(“%s”,ptr);

return0;

}

@函數名稱:strlwr

函數原型:char *strlwr(char *s)

函數功能:將字符串中的字符變為小寫字符

函數返回:指向s的指針

參數說明:

所屬文件:string.h

[cpp] view plain

#includestring.h

intmain()

{

charstr[]=”HOWTOSAY”;

printf(“%s”,strlwr(str));

return0;

}

@函數名稱:strerror

函數原型:char *strerror(int errnum)

函數功能:得到錯誤信息的內容信息

函數返回:錯誤提示信息字符串指針

參數說明:errnum-錯誤編號

所屬文件:string.h

[cpp] view plain

#includestdio.h

#includeerrno.h

intmain()

{

char*buffer;

buffer=strerror(errno);

printf(“Error:%s”,buffer);

return0;

}

@函數名稱:memcpy

函數原型:void *memcpy(void *dest, const void *src, size_t n)

函數功能:字符串拷貝

函數返回:指向dest的指針

參數說明:src-源字符串,n-拷貝的最大長度

所屬文件:string.h,mem.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

charsrc[]=”******************************”;

chardest[]=”abcdefghijlkmnopqrstuvwxyz0123456709″;

char*ptr;

printf(“destinationbeforememcpy:%s\n”,dest);

ptr=memcpy(dest,src,strlen(src));

if(ptr)

printf(“destinationaftermemcpy:%s\n”,dest);

else

printf(“memcpyfailed”);

return0;

}

輸出:

[cpp] view plain

/*************************************************************

destinationbeforememcpy:abcdefghijlkmnopqrstuvwxyz0123456709

destinationaftermemcpy:******************************456709

**************************************************************/

@函數名稱:memccpy

函數原型:void *memccpy(void *dest, const void *src, int c, size_t n)

函數功能:字符串拷貝,到指定長度或遇到指定字符時停止拷貝

函數返回:

參數說明:src-源字符串指針,c-中止拷貝檢查字符,n-長度,dest-拷貝底目的字符串指針

所屬文件:string.h,mem.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

char*src=”Thisisthesourcestring”;

chardest[50];

char*ptr;

ptr=memccpy(dest,src,’c’,strlen(src));

if(ptr)

{

*ptr=’\0′;

printf(“Thecharacterwasfound:%s”,dest);

}

else

printf(“Thecharacterwasn’tfound”);

return0;

}

輸出:

[cpp] view plain

/*****************************************

Thecharacterwasfound:Thisisthesourc

*****************************************/

PS:指定字符被複制到dest中,memccpy返回了dest中指定字符的下一處的地址,返回NULL表示未遇到指定字符

@函數名稱:memchr

函數原型:void *memchr(const void *s, int c, size_t n)

函數功能:在字符串中第開始n個字符中尋找某個字符c的位置

函數返回:返回c的位置指針,返回NULL時表示未找到

參數說明:s-要搜索的字符串,c-要尋找的字符,n-指定長度

所屬文件:string.h,mem.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

charstr[17];

char*ptr;

strcpy(str,”Thisisastring”);

ptr=memchr(str,’r’,strlen(str));

if(ptr)

printf(“Thecharacter’r’isatposition:%d”,ptr-str);

else

printf(“Thecharacterwasnotfound”);

return0;

}

@函數名稱:memcmp

函數原型:int memcmp(const void *s1, const void *s2,size_t n)

函數功能:按字典順序比較兩個串s1和s2的前n個字節

函數返回:0,=0,0分別表示s1,=,s2

參數說明:s1,s2-要比較的字符串,n-比較的長度

所屬文件:string.h,mem.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

char*buf1=”ABCDE123″;

char*buf2=”abcde456″;

intstat;

stat=memcmp(buf1,buf2,5);

printf(“Thestringstoposition5are”);

if(stat)printf(“not”);

printf(“thesame\n”);

return0;

}

@函數名稱:memicmp

函數原型:int memicmp(const void *s1, const void *s2, size_t n)

函數功能:按字典順序、不考慮字母大小寫對字符串s1,s2前n個字符比較

函數返回:0,=0,0分別表示s1,=,s2

參數說明:s1,s2-要比較的字符串,n-比較的長度

所屬文件:string.h,mem.h

[cpp] view plain

#includestdio.h

#includestring.h

intmain()

{

char*buf1=”ABCDE123″;

char*buf2=”abcde456″;

intstat;

stat=memicmp(buf1,buf2,5);

printf(“Thestringstoposition5are”);

if(stat)printf(“not”);

printf(“thesame”);

return0;

}

輸出:

[cpp] view plain

/**************************************

Thestringstoposition5arethesame

***************************************/

@函數名稱:memmove

函數原型:void *memmove(void *dest, const void *src, size_t n)

函數功能:字符串拷貝

函數返回:指向dest的指針

參數說明:src-源字符串,n-拷貝的最大長度

所屬文件:string.h,mem.h

[cpp] view plain

#includestring.h

#includestdio.h

intmain()

{

chardest[40]=”abcdefghijklmnopqrstuvwxyz0123456789″;

printf(“destinationpriortomemmove:%s\n”,dest);

memmove(dest+1,dest,35);

printf(“destinationaftermemmove:%s”,dest);

return0;

}

PS:與memcpy不同的是,memmove可以處理目的字符串與源字符串地址空間出現重疊的情況,可保證待複製的內容不被破壞。

@函數名稱: memset

函數原型: void *memset(void *s, int c, size_t n)

函數功能: 字符串中的n個字節內容設置為c

函數返回:

參數說明: s-要設置的字符串,c-設置的內容,n-長度

所屬文件: string.h,mem.h

[cpp] view plain

#includestring.h

#includestdio.h

#includemem.h

intmain()

{

charbuffer[]=”Helloworld”;

printf(“Bufferbeforememset:%s/n”,buffer);

memset(buffer,’*’,strlen(buffer)-1);

printf(“Bufferaftermemset:%s”,buffer);

return0;

}

c語言string的用法大全相關 文章 :

★ c語言string的用法

★ c語言的用法

★ Linux C語言字符與字符串處理

★ c語言中strcmp的用法

★ c語言大括號的用法

★ c語言位運算符的用法

★ c語言char的用法

★ c語言中sort的用法詳解

★ c語言中int的用法

★ c語言map的用法

C語言中的char具體用法

C語言中char用於定義字符類型變量或字符指針變量,例如“char a;”則定義了變量a是字符類型,“char *a;”則定義了變量a是字符指針類型。

char是C語言整型數據中比較古怪的一個,其它的如int/long/short等不指定signed/unsigned時都默認是signed,但char在標準中不指定為signed/unsigned,編譯器可以實現為帶符號的,也可以實現為不帶符號的。

關於char還有一個特殊的語言就是char *,它在C語言中有專門的語義,既不同於signed char *,也不同於unsigned char *,專門用於指以’\0’為結束的字符串。

C語言中char的不同應用:

1、字符型(char)

字符型(char)用於儲存字符(character),如英文字母或標點。嚴格來說,char 其實也是整數類型(integer type),因為 char 類型儲存的實際上是整數,而不是字符。計算機使用特定的整數編碼來表示特定的字符。

C 語言中保證 char 佔用空間的大小足以儲存系統所用的基本字符集的編碼。C 語言定義一個字節(byte)的位數為 char 的位數,所以一個字節可能是 16 位,也可能是 32 位,而不僅僅限於 8 位。

2、聲明字符型變量

字符型變量的聲明方式和其它類型變量的聲明方式一樣:

char good;

char better, best;

以上代碼聲明了三個字符型變量:good、better,和 best。

char是分配1字節,存儲的是ASCII碼,A:65,a:97;

在命名char類型是不要使用雙引號,c中必須單引號,在java中就高級點了什麼都可以。

補充:printf()輸出時對於char有點不同,使用“”%d“是輸出字符代表的ASCII碼。使用:%c,是輸出單個字符;使用%s:就是輸出多個字符了。

擴展資料:

C語言中的基本類型:

1、算數類型:

它們是算術類型,包括兩種類型:整數類型和浮點類型。  

2    枚舉類型:

它們也是算術類型,被用來定義在程序中只能賦予其一定的離散整數值的變量。  

3    void 類型:

類型說明符 void 表明沒有可用的值。  

4    派生類型:

它們包括:指針類型、數組類型、結構類型、共用體類型和函數類型。

數組類型和結構類型統稱為聚合類型。函數的類型指的是函數返回值的類型。在本章節接下來的部分我們將介紹基本類型,其他幾種類型會在後邊幾個章節中進行講解。

void 類型:

void 類型指定沒有可用的值。它通常用於以下三種情況下:

1、函數返回為空:

C 中有各種函數都不返回值,或者您可以說它們返回空。不返回值的函數的返回類型為空。例如 void exit (int status)。 

2、函數參數為空:

C 中有各種函數不接受任何參數。不帶參數的函數可以接受一個 void。例如 int rand(void)。

3、指針指向:

類型為 void * 的指針代表對象的地址,而不是類型。例如,內存分配函數 void *malloc( size_t size ); 返回指向 void 的指針,可以轉換為任何數據類型。

參考資料來源:百度百科-char

c語言int的用法

C 語言提供了很多整數類型(整型),這些整型的區別在於它們的取值範圍的大小,以及是否可以為負。int 是整型之一,一般被稱為整型。以後,在不產生歧義的情況下,我們把整數類型和 int 都稱為整型。下面我們來看看c語言int的用法。 1. 整型 int int 代表有符號整數,也就是說,用 int 聲明的變量可以是正數,可以是負數,也可以是零,但是只能是整數。標準規定 int 的最小取值範圍是 -32767 到 32767。int 的取值範圍因機器而異,但是一定要大於或者等於 -32767 到 32767。一般來說,int 佔用一個字的內存空間。因此,字長為 16 位(Bit)的舊式 IBM 兼容機使用 16 位來儲存整型 int ,取值範圍是 -32768 到 32767 。目前的個人電腦一般都是 32 位字長的,這些電腦中,int 一般也是 32 位的,取值範圍是 -2147483648 到 2147483647。對於使用 64 位 CPU 的電腦,使用更多位儲存 int 也是很自然的事情,取值範圍當然也會更大。 2. 聲明 int 類型的變量 正如我們在以前的教程里看到的那樣,int 用於聲明整型變量:以 int 打頭,後面跟着變量的名字,最後以分號(;)結束。例如: int erns; /* 聲明一個變量 */ /* 注意:一定要用逗號(,),不能用分號(;)*/ int hogs, cows, goats; /* 聲明三個變量 */ 以上聲明創建了變量,但是沒有給它們提供“值(value)”。在前面的教程中,我們已經用了兩種方法使變量獲得“值”。一種是賦值:cows = 500; 。另一種是使用 scanf 函數:scanf( “%d”, goats ); 。下面我們來學習第三種方法。 3. 初始化變量 初始化變量是指給變量賦初值:聲明變量的時候,在變量名的後面寫上等號(=),然後寫下你希望賦予變量的“值”。例如: int hogs = 21; int cows = 32, goats = 14; int dogs, cats = 94; 以上聲明創建了變量,並且為這些變量分配了空間,同時也賦了初值。注意,第三行中只有 cats 被初始化為 94,而 dogs 沒有被初始化!如下圖: 4. int 常量 上面的例子中,21、32、14,以及 94 都是整數常量。C 語言中,整數常量的默認類型是 int。如果整數常量的大小超過了 int 的取值範圍,那麼編譯器將會把這個整數常量當作 long int 類型來處理,這個我們後面還會講到。21、32、14 和 94 都在 int 的取值範圍之內,因此它們都是 int 常量。 5. 輸出 int 型數據 我們可以用 printf 函數來輸出 int 型數據。正如我們在前面的教程中看到的那樣,佔位符 %d 代表輸出的是 int 型數據,它告訴 printf 函數在什麼地方輸出相應的 int 型數據。%d 也被稱為格式限定符(format specifier),因為它指定了 printf 函數應該使用什麼形式來輸出數據。printf 函數的第一個參數只能是字符串,這個字符串被稱為格式串(format string)。格式串中有多少個 %d,我們就應該相應地提供多少個 int 型參數給 printf 函數。int 型參數可以是 int 型變量,int 型常量,以及結果為 int 型的表達式等。例如: int year = 2005; /* year 是 int 型變量 */ printf( “Today is %d-%d-%d “, year, 9, 20 + 9 ); /* 20 + 9 是加法表達式 */ 保證格式限定符的數目和參數數目一致是我們的責任,編譯器不負責捕捉這種錯誤!例如: #include stdio.h int main(void) { int ten = 10, two = 2; printf(“%d minus %d is %d “, ten ); /* 少寫了兩個參數 */ getchar(); /* 等待用戶按回車 */ return 0; } 這個程序可以通過編譯,但是運行結果將會出乎意料,因為我們少寫了兩個參數。標準規定,如果格式限定符的數目大於參數數目,則 printf 函數的行為是未定義的;如果參數數目大于格式限定符的數目,則多餘的參數會被忽略。 6. 八進制(octal)和十六進制(hexadecimal) C 語言中,整數常量默認是十進制(decimal)整數。通過在整數常量前面加上特定的前綴,可以把它設定為八進制或者十六進制整數。前綴 0x 或者 0X 把整數常量設定為十六進制整數。注意,是數字 0 ,而不是字母 O ,別搞錯了哦!例如:十進制的 16 用十六進制來表示是 0x10 或者 0X10 。在整數常量前面加上前綴 0 ,表示它是八進制整數。注意,是數字 0 ,而不是字母 O 。例如:十進制的 16 表示為八進制就是 020 。 7. 以八進制或者十六進制形式輸出數據 使用格式限定符 %o 可以以八進制的形式輸出整數。注意,是小寫字母 o ,不是數字 0 。使用 %x 或者 %X 可以以十六進制的形式輸出整數。小寫 x 表示輸出使用小寫字母,大寫 X 表示輸出使用大寫字母。使用 %#o,%#x 或者 %#X,得到的輸出將包括前綴 0,0x 或者 0X。例如: #include stdio.h int main(void) { int x = 200; printf(“dec = %d; octal = %o; hex = %x; HEX = %X “, x, x, x, x); printf(“dec = %d; octal = %#o; hex = %#x; HEX = %#X “, x, x, x, x); getchar(); return 0; } 這個程序的輸出是: dec = 200; octal = 310; hex = c8; HEX = C8 dec = 200; octal = 0310; hex = 0xc8; HEX = 0XC8 1. 其它整數類型 int 是 C 語言的基本整數類型,可以滿足我們處理一般數據的需求。C 語言還提供了四個可以修飾 int 的關鍵字:short、long、signed,以及 unsigned。利用這四個關鍵字,C 語言標準定義了以下整數類型: 1) short int(可簡寫為 short),和 int 一樣,也是有符號整數 2) long int(簡寫:long),有符號整數 3) long long int(簡寫:long long),C99 標準添加的類型, 有符號整數 4) unsigned int(簡寫:unsigned),無符號整數,不能表示負數 5) unsigned long int(簡寫:unsigned long),無符號整數, 不能表示負數 6) unsigned short int(簡寫:unsigned short),無符號整數, 不能表示負數 7) unsigned long long int(簡寫:unsigned long long), C99 添加的類型,無符號整數 8) 所有沒有標明 unsigned 的整數類型默認都是有符號整數。 在這些整數類型前面加上 signed 可以使讀者更清楚地知道 這些是有符號整數,儘管有沒有 signed 都表示有符號整數。 例如:signed int 等同於 int 。 一般我們把 short 稱為短整型,把 long 稱為長整型,把 long long 稱為超長整型,把 int 稱為整型。unsigned 打頭的那些整數類型統稱為無符號整型。例如:我們稱 unsigned short 為無符號短整型。以此類推。 2. 聲明方式 這些整數類型的聲明方式與 int 類型的聲明方式一樣。例如: long int estine; long johns; short int erns; short ribs; unsigned int s_count; unsigned players; unsigned long headcount; unsigned short yesvotes; long long ago; /* C99 特有 */ unsigned long long ego; /* C99 特有 */ 如果您的編譯器不支持 C99 標準,那就不能使用 long long 和 unsigned long long。 3. 取值範圍(表示範圍) 標準也規定了這些整數類型的最小取值範圍。short 的最小表示範圍和 int 一樣,都是 -32767 到 32767 。也就是 -(2^15 – 1)到(2^15 – 1)。其中,2^15表示 2 的 15 次方。類似地,2 的 20 次方記作 2^20 ,以此類推。注意:C 語言中 2^15 並不表示 2 的 15 次方,為了書寫方便,我們姑且這麼表示。long 的最小取值範圍是 -2147483647 到 2147483647 。也就是 -(2^31 – 1) 到 (2^31 – 1) 。unsigned short的最小表示範圍和unsigned int 一樣,都是 0 到 65535(2^16 – 1)。unsigned long 的最小取值範圍是 0 到 4294967295(2^32 – 1)。long long的最小取值範圍是 -9223372036854775807(-(2^63 – 1))到 9223372036854775807(2^63 – 1);unsigned long long 是 0 到 18446744073709551615(2^64 – 1)。 標準規定,int 的表示範圍不能小於 short 的表示範圍,long 的表示範圍不能小於 int 的表示範圍。這就是說 short 型變量佔用的空間可能比 int 型變量少,而 long 型變量佔用的空間可能比 int 型變量多。16 位(bit)的計算機中,int 和 short 一般都是 16 位,而 long 是 32位;32位的計算機中,short一般是 16 位,而long和int是 32位。TC2(16位的編譯器)中,int是16位的;而 Dev-C++(32 位的編譯器)中,int 是 32 位的。 使用 unsigned int 聲明的變量只能表示非負整數(0 和正整數)。如果 int 是 16 位的話,那麼 unsigned int 的表示範圍是 0 到 65535(2^16 – 1)。這是因為 unsigned 不需要符號位,可以把 16 個位全都用於表示整數。而 int 需要一個位作為符號位,用於表示正負,只有 15 個位用於表示整數。 目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具體某個編譯器到底使用多少位來表示這些類型,我們可以用運算符 sizeof 來獲取。例如: printf( “%lu “, (unsigned long)sizeof(int) * 8 ); /* 輸出 int 的位數 */ printf( “%zu “, sizeof(short) * 8 ); /* 輸出 short 的位數 */ sizeof 運算符返回其操作數佔用空間的大小,以字節(Byte)為單位。注意,C 定義字節的大小為 char 類型的大小。char 通常是 8 位(bit)的,當然也可以更大。這裡我們假設 char 是 8 位的。點擊查看 char 類型詳細介紹 sizeof 的用法我們以後會講到,現在只要有個印象就好了。第二句中的 %zu 是 C99 特有的,如果您的編譯器不支持 C99(準確地說,應該是如果您的編譯器使用的庫函數不支持 C99),運行結果將會出錯。 4. 整數類型的選擇 如果您要處理的只是非負整數,那麼應該優先使用 unsigned 打頭的那些整數類型。如果您要處理的整數超出了 int 所能表示的範圍,並且您的編譯器中,long 的表示範圍比 int 大,那就使用 long。不過,若非必要,盡量不要用 long,因為它可能會降低程序運行效率。有一點要注意:如果您的編譯器中,long 和 int 都是 32 位的,並且您需要使用 32 位整數,那麼應該用 long,而不要用 int。只有這樣,我們的程序才可以安全地移植到 16 位的計算機,因為 16 位的計算機中,int 一般也是 16 位的。類似地,如果您需要使用 64 位整數,那就用 long long。如果 int 是 32 位的話,那麼使用 short 可以節省空間,不過您得確保您要處理的整數不會超出 short 的表示範圍。這種“節省”對內存大的計算機來說,是沒什麼意義的。 5. long 型常量和 long long 型常量 一般來說,整數常量是被當作 int 類型來存儲的。如果我們使用的整數常量超出了 int 的表示範圍,C 語言規定編譯器自動使用 unsigned int 來處理這個常量。如果 unsigned 也不足以表示這個常量的話,編譯器就會用 long。如果還表示不了的話,那就依次用 unsigned long,long long,unsigned long long。如果 unsigned long long 也表示不了,那麼編譯器就沒轍了。注意:long long 和 unsigned long long 是 C99 特有的。例如:如果 int 是 16 位的話,它就表示不了常量 1000000。編譯器會使用 long 來處理這個常量,因為 unsigned int 也表示不了 1000000 。 同樣,十六進制和八進制整數常量通常也是被作為 int 來處理。但是,當我們使用的常量超出了 int 的表示範圍後,編譯器會依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的類型足以表示那個常量為止。 有時,我們使用的是較小的常量,但是我們希望這個常量被當作 long 來處理,這就需要在這個常量後面加上後綴 l(小寫字母 l)或者 L(大寫字母 L)。我們應該避免使用 l ,因為 l 容易和數字 1 混淆。例如:整數常量 7 是被作為 int 來處理的,但整數常量 7L(或者 7l)是被作為 long 來處理的。類似地,在整數常量後面加上後綴 ll 或者 LL ,這個常量就會被當作 long long 來處理。例如:3LL 。如果想使用無符號整數常量的話,還要配合使用後綴 u 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。 這些後綴也可以用於十六進制和八進制整數常量。例如:020L,010LL,0x30uL,0x40ull 。 1. 輸出各種整數類型的變量 輸出不同類型的整數,需要使用不用的格式限定符。輸出 unsigned int 類型的整數,要用 %u 。輸出 long ,要用 %ld;如果要以十六進制或者八進制形式輸出,那就用 %lx(或者%lX)或者 %lo。注意:雖然整數常量的後綴使用大寫或者小寫英文字母都沒關係,但是它們格式限定符必須使用小寫!如果我們要輸出 short 類型的整數,可以在 %d 中間加上前綴 h,也就是%hd;同理,%ho 和 %hx(或者 %hX )分別表示以八進制或十六進制形式輸出。前綴 h 和 l 可以和 u 組合,表示輸出無符號整數。例如:%lu 表示輸出 unsigned long 類型的整數;%hu 表示輸出unsigned short類型的整數。如果您的編譯器支持C99,可以使用 %lld 和 %llu 分別表示輸出 long long 和 unsigned long long 。下面我們來看一個輸出各種類型整數的程序: #include stdio.h int main(void) { unsigned int un = 3000000000; /* 我使用的編譯器 int 是 32 位的 */ short end = 200; /* 而 short 是 16 位的 */ long big = 65537; printf(“un = %u and not %d “, un, un); printf(“end = %hd and %d “, end, end); printf(“big = %ld and not %hd “, big, big); printf(“Press ENTER to quit…”); getchar(); return 0; } 使用 Dev-C++ 編譯運行這個程序輸出結果如下: un = 3000000000 and not -1294967296 end = 200 and 200 big = 65537 and not 1 Press ENTER to quit… 這個程序表明,錯誤使用格式限定符會導致意想不到的輸出。首先,錯誤使用 %d 來做無符號整型變量 un 的格式限定符,導致輸出的是負數。這是因為我的計算機使用相同的二進制形式來表示 3000000000 和 -129496296 ,而計算機只認識二進制。所以,如果我們使用 %u 告訴 printf 輸出無符號整數,輸出的就是 3000000000;如果我們誤用了 %d,那麼輸出的就是一個負數。不過,如果我們把代碼中的 3000000000 改成 96 的話,輸出就不會出現異常。因為 96 沒有超出 int 的表示範圍。 然後,對於第二個 printf,無論我們使用 %hd 還是 %d,輸出的結果都是一樣的。這是因為 C 語言標準規定,當 short 類型值傳遞給函數時,要自動轉化成 int 類型值。之所以轉化成 int,是因為 int 被設計為計算機處理效率最高的整數類型。所以,對於 short 和 int 大小不同的計算機來說,把變量 end 轉化成 int 類型再傳遞給函數,速度更快。如此說來,h 好像沒有存在意義。其實不然。我們可以用 %hd 來看看較大的整數類型被截斷成 short 類型的時候會是什麼樣的。 而第三個 printf,由於誤用 %hd,導致輸出是 1。這是因為,如果 long 是 32 位的話,65537 的二進制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 輸出 short 類型的值,從而導致 printf 只處理 16 位數據(假設 short 是 16 位的),最終導致輸出 1。 在前面的教程里,我們說過,保證格式限定符的數目和參數數目一致是我們的責任。同樣,保證格式限定符的類型和參數類型一致也是我們的責任!正如上面所說的那樣,錯誤使用格式限定符會導致意想不到的輸出!標準規定,如果任意參數和與其對應的格式限定符類型不一致,則 printf 的行為是未定義的;如果格式限定符本身就是非法的,則 printf 的行為也是未定義的。 2. 整數溢出 首先請看以下程序: #include stdio.h int main(void) { /* 32 位 int 表示範圍的上限和下限 */ int i = 2147483647, j = -2147483648; unsigned int k = 4294967295, l = 0; printf(“%d %d %d %d “, i, i+1, j, j-1); printf(“%u %u %u %u %u “, k, k+1, k+2, l, l-1); printf(“Press ENTER to quit…”); getchar(); return 0; } 使用 Dev-C++ 編譯運行這個程序輸出結果如下: 2147483647 -2147483648 -2147483648 2147483647 4294967295 0 1 0 4294967295 Press ENTER to quit… 本例中,i+1 是負數,j-1 是正數,k+1 是 0,l-1 是 4294967295 。這是因為加減運算過後,它們的值超出了它們對應的那種整數類型的表示範圍,我們把這種現象稱為溢出。 unsigned int 型變量的值如果超過了上限,就會返回 0,然後從 0 開始增大。如果低於下限,那麼就會到達 unsigned 型的上限,然後從上限開始減小。就好像一個人繞着跑道跑步一樣,繞了一圈,又返回出發點。一般,int 型變量溢出的話,會變成負數,或者正數。 對於 unsigned 類型的整數,它們溢出時的情況一定和上面描述的一樣,這是標準規定的。但是標準並沒有規定有符號整數溢出時會出現什麼情況。這裡描述的有符號整數溢出時出現的情況是最常見的,但是在別的計算機,使用別的編譯器,也可能出現不同的情況。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/290927.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 13:14
下一篇 2024-12-24 14:15

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論