?? c.txt
字號(hào):
/ * Copy src_ string into dest-string. Notice that the destination
string is the first argument. Notice also that the strcpy()
function returns a pointer to the destination string. * /
printf("Done! dest_string is: %s\\n" ,
strcpy(dest_string, src_string)) ;
printf("Encore! Let\'s copy one CUSTREC to another. \\n") ;
prinft("I\'ll copy src_cust into dest_cust. \\n");
/ * First, intialize the src_cust data members. * /
src_cust. id = 1 ;
strcpy(src_cust. last_name, "Strahan");
strcpy(src_cust. first_name, "Troy");
/ * Now, Use the memcpy() function to copy the src-cust structure to
the dest_cust structure. Notice that, just as with strcpy(), the
destination comes first. * /
memcpy(&dest_cust, &src_cust, sizeof(CUSTREC));
printf("Done! I just copied customer number # %d (%s %s). " ,
dest_cust. id, dest_cust. first_name, dest_cust. last_name) ;
}
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-9 23:46:23
--
28.怎樣將數(shù)字轉(zhuǎn)換為字符串?
C語(yǔ)言提供了幾個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),可以將任意類型(整型、長(zhǎng)整型、浮點(diǎn)型等)的數(shù)字轉(zhuǎn)換為字符串。以下是用itoa()函數(shù)將整數(shù)轉(zhuǎn)換為字符串的一個(gè)例子:
# include <stdio. h>
# include <stdlib. h>
void main (void);
void main (void)
{
int num = 100;
char str[25];
itoa(num, str, 10);
printf("The number \'num\' is %d and the string \'str\' is %s. \\n" ,
num, str);
}
itoa()函數(shù)有3個(gè)參數(shù):第一個(gè)參數(shù)是要轉(zhuǎn)換的數(shù)字,第二個(gè)參數(shù)是要寫(xiě)入轉(zhuǎn)換結(jié)果的目標(biāo)字符串,第三個(gè)參數(shù)是轉(zhuǎn)移數(shù)字時(shí)所用的基數(shù)。在上例中,轉(zhuǎn)換基數(shù)為10。
下列函數(shù)可以將整數(shù)轉(zhuǎn)換為字符串:
----------------------------------------------------------
函數(shù)名 作 用
----------------------------------------------------------
itoa() 將整型值轉(zhuǎn)換為字符串
itoa() 將長(zhǎng)整型值轉(zhuǎn)換為字符串
ultoa() 將無(wú)符號(hào)長(zhǎng)整型值轉(zhuǎn)換為字符串
----------------------------------------------------------
請(qǐng)注意,上述函數(shù)與ANSI標(biāo)準(zhǔn)是不兼容的。能將整數(shù)轉(zhuǎn)換為字符串而且與ANSI標(biāo)準(zhǔn)兼容的方法是使用sprintf()函數(shù),請(qǐng)看下例:
#include<stdio.h>
# include <stdlib. h>
void main (void);
void main (void)
{
int num = 100;
char str[25];
sprintf(str, " %d" , num);
printf ("The number \'num\' is %d and the string \'str\' is %s. \\n" ,
num, str);
}
在將浮點(diǎn)型數(shù)字轉(zhuǎn)換為字符串時(shí),需要使用另外一組函數(shù)。以下是用fcvt()函數(shù)將浮點(diǎn)型值轉(zhuǎn)換為字符串的一個(gè)例子:
# include <stdio. h>
# include <stdlib. h>
void main (void);
void main (void)
{
double num = 12345.678;
char * sir;
int dec_pl, sign, ndigits = 3; /* Keep 3 digits of precision. * /
str = fcvt(num, ndigits, &dec-pl, &sign); /* Convert the float
to a string. * /
printf("Original number; %f\\n" , num) ; /* Print the original
floating-point
value. * /
printf ("Converted string; %s\\n",str); /* Print the converted
string\'s value. * /
printf ("Decimal place: %d\\n" , dec-pi) ; /* Print the location of
the decimal point. * /
printf ("Sign: %d\\n" , sign) ; /* Print the sign.
0 = positive,
1 = negative. * /
}
fcvt()函數(shù)和itoa()函數(shù)有數(shù)大的差別。fcvt()函數(shù)有4個(gè)參數(shù):第一個(gè)參數(shù)是要轉(zhuǎn)換的浮點(diǎn)型值;第二個(gè)參數(shù)是轉(zhuǎn)換結(jié)果中十進(jìn)制小數(shù)點(diǎn)右側(cè)的位數(shù);第三個(gè)參數(shù)是指向一個(gè)整數(shù)的指針,該整數(shù)用來(lái)返回轉(zhuǎn)換結(jié)果中十進(jìn)制小數(shù)點(diǎn)的位置;第四個(gè)參數(shù)也是指向一個(gè)整數(shù)的指針,該整數(shù)用來(lái)返回轉(zhuǎn)換結(jié)果的符號(hào)(0對(duì)應(yīng)于正值,1對(duì)應(yīng)于負(fù)值)。
需要注意的是,fcvt()函數(shù)的轉(zhuǎn)換結(jié)果中并不真正包含十進(jìn)制小數(shù)點(diǎn),為此,fcvt()函數(shù)返回在轉(zhuǎn)換結(jié)果中十進(jìn)制小數(shù)點(diǎn)應(yīng)該占據(jù)的位置。在上例中,整型變量dec_pl的結(jié)果值為5,因?yàn)樵谵D(zhuǎn)換結(jié)果中十進(jìn)制小數(shù)點(diǎn)應(yīng)該位于第5位后面。如果你要求轉(zhuǎn)換結(jié)果中包含十進(jìn)制小數(shù)點(diǎn),你可以使用gcvt()函數(shù)(見(jiàn)下表)。
下列函數(shù)可以將浮點(diǎn)型值轉(zhuǎn)換為字符串:
-------------------------------------------------------------------------
函數(shù)名 作 用
-------------------------------------------------------------------------
ecvt() 將雙精度浮點(diǎn)型值轉(zhuǎn)換為字符串,轉(zhuǎn)換結(jié)果中不包含十進(jìn)制小數(shù)點(diǎn)
fcvt() 以指定位數(shù)為轉(zhuǎn)換精度,余同ecvt()
gcvt() 將雙精度浮點(diǎn)型值轉(zhuǎn)換為字符串,轉(zhuǎn)換結(jié)果中包含十進(jìn)制小數(shù)點(diǎn)
-------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-10 0:12:02
--
29.怎樣將字符串轉(zhuǎn)換為數(shù)字?
C語(yǔ)言提供了幾個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),可以將字符串轉(zhuǎn)換為任意類型(整型、長(zhǎng)整型、浮點(diǎn)型等)的數(shù)字。以下是用atoi()函數(shù)將字符串轉(zhuǎn)換為整數(shù)的一個(gè)例子:
# include <stdio. h>
# include <stdlib. h>
void main (void) ;
void main (void)
{
int num;
char * str = "100";
num = atoi(str);
printf("The string \'str\' is %s and the number \'num\' is %d. \\n",
str, num);
}
atoi()函數(shù)只有一個(gè)參數(shù),即要轉(zhuǎn)換為數(shù)字的字符串。atoi()函數(shù)的返回值就是轉(zhuǎn)換所得的整型值。
下列函數(shù)可以將字符串轉(zhuǎn)換為數(shù)字:
------------------------------------------------------------------------
函數(shù)名 作 用
------------------------------------------------------------------------
atof() 將字符串轉(zhuǎn)換為雙精度浮點(diǎn)型值
atoi() 將字符串轉(zhuǎn)換為整型值
atol() 將字符串轉(zhuǎn)換為長(zhǎng)整型值
strtod() 將字符串轉(zhuǎn)換為雙精度浮點(diǎn)型值,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字
strtol() 將字符串轉(zhuǎn)換為長(zhǎng)整值,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字
strtoul() 將字符串轉(zhuǎn)換為無(wú)符號(hào)長(zhǎng)整型值,并報(bào)告不能被轉(zhuǎn)換的所有剩余數(shù)字
------------------------------------------------------------------------
將字符串轉(zhuǎn)換為數(shù)字時(shí)可能會(huì)導(dǎo)致溢出,如果你使用的是strtoul()這樣的函數(shù),你就能檢查這種溢出錯(cuò)誤。請(qǐng)看下例:
# include <stdio. h>
# include <stdlib. h>
# include <limits. h>
void main(void);
void main (void)
{
char* str = "1234567891011121314151617181920" ;
unsigned long num;
char * leftover;
num = strtoul(str, &leftover, 10);
printf("Original string: %s\\n",str);
printf("Converted number: %1u\\n" , num);
printf("Leftover characters: %s\\n" , leftover);
}
在上例中,要轉(zhuǎn)換的字符串太長(zhǎng),超出了無(wú)符號(hào)長(zhǎng)整型值的取值范圍,因此,strtoul()函數(shù)將返回ULONG_MAX(4294967295),并使。char leftover指向字符串中導(dǎo)致溢出的那部分字符;同時(shí),strtoul()函數(shù)還將全局變量errno賦值為ERANGE,以通知函數(shù)的調(diào)用者發(fā)生了溢出錯(cuò)誤。函數(shù)strtod()和strtol()處理溢出錯(cuò)誤的方式和函數(shù)strtoul()完全相同,你可以從編譯程序文檔中進(jìn)一步了解這三個(gè)函數(shù)的有關(guān)細(xì)節(jié)。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-11 19:06:22
--
以下關(guān)于指針的內(nèi)容希望大家能認(rèn)真仔細(xì)地看 相信不論你是高手還是入門(mén)者 都將對(duì)你受用不小
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-11 19:08:52
--
由于指針在C語(yǔ)言學(xué)習(xí)中確實(shí)存在一定難度 那么我就先引入些有關(guān)指針的基礎(chǔ)知識(shí)讓各位回顧一下
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-11 19:09:27
--
指針為C語(yǔ)言編程提供了強(qiáng)大的支持——如果你能正確而靈活地利用指針,你就可以直接切入問(wèn)題的核心,或者將程序分割成一個(gè)個(gè)片斷。一個(gè)很好地利用了指針的程序會(huì)非常高效、簡(jiǎn)潔和精致。
利用指針你可以將數(shù)據(jù)寫(xiě)入內(nèi)存中的任意位置,但是,一旦你的程序中有一個(gè)野指針("wild”pointer),即指向一個(gè)錯(cuò)誤位置的指針,你的數(shù)據(jù)就危險(xiǎn)了——存放在堆中的數(shù)據(jù)可能會(huì)被破壞,用來(lái)管理堆的數(shù)據(jù)結(jié)構(gòu)也可能會(huì)被破壞,甚至操作系統(tǒng)的數(shù)據(jù)也可能會(huì)被修改,有時(shí),上述三種破壞情況會(huì)同時(shí)發(fā)生。
此后可能發(fā)生的事情取決于這樣兩點(diǎn):第一,內(nèi)存中的數(shù)據(jù)被破壞的程度有多大;第二,內(nèi)存中的被破壞的部分還要被使用多少次。在有些情況下,一些函數(shù)(可能是內(nèi)存分配函數(shù)、自定義函數(shù)或標(biāo)準(zhǔn)庫(kù)函數(shù))將立即(也可能稍晚一點(diǎn))無(wú)法正常工作。在另外一些情況下,程序可能會(huì)終止運(yùn)行并報(bào)告一條出錯(cuò)消息;或者程序可能會(huì)掛起;或者程序可能會(huì)陷入死循環(huán);或者程序可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果;或者程序看上去仍在正常運(yùn)行,因?yàn)槌绦驔](méi)有遭到本質(zhì)的破壞。
值得注意的是,即使程序中已經(jīng)發(fā)生了根本性的錯(cuò)誤,程序有可能還會(huì)運(yùn)行很長(zhǎng)一段時(shí)間,然后才有明顯的失常表現(xiàn);或者,在調(diào)試時(shí),程序的運(yùn)行完全正常,只有在用戶使用時(shí),它才會(huì)失常。
在C語(yǔ)言程序中,任何野指針或越界的數(shù)組下標(biāo)(out-of-bounds array subscript)都可能使系統(tǒng)崩潰。兩次釋放內(nèi)存的操作也會(huì)導(dǎo)致這種結(jié)果。你可能見(jiàn)過(guò)一些C程序員編寫(xiě)的程序中有嚴(yán)重的錯(cuò)誤,現(xiàn)在你能知道其中的部分原因了。
有些內(nèi)存分配工具能幫助你發(fā)現(xiàn)內(nèi)存分配中存在的問(wèn)題,例如漏洞(leak,見(jiàn)7.21),兩次釋放一個(gè)指針,野指針,越界下標(biāo),等等。但這些工具都是不通用的,它們只能在特定的操作系統(tǒng)中使用,甚至只能在特定版本的編譯程序中使用。如果你找到了這樣一種工具,最好試試看能不能用,因?yàn)樗転槟愎?jié)省許多時(shí)間,并能提高你的軟件的質(zhì)量。
指針的算術(shù)運(yùn)算是C語(yǔ)言(以及它的衍生體,例如C++)獨(dú)有的功能。匯編語(yǔ)言允許你對(duì)地址進(jìn)行運(yùn)算,但這種運(yùn)算不涉及數(shù)據(jù)類型。大多數(shù)高級(jí)語(yǔ)言根本就不允許你對(duì)指針進(jìn)行任何操作,你只能看一看指針指向哪里。
C指針的算術(shù)運(yùn)算類似于街道地址的運(yùn)算。假設(shè)你生活在一個(gè)城市中,那里的每一個(gè)街區(qū)的所有街道都有地址。街道的一側(cè)用連續(xù)的偶數(shù)作為地址,另一側(cè)用連續(xù)的奇數(shù)作為地址。如果你想知道River Rd.街道158號(hào)北邊第5家的地址,你不會(huì)把158和5相加,去找163號(hào);你會(huì)先將5(你要往前數(shù)5家)乘以2(每家之間的地址間距),再和158相加,去找River Rd.街道的168號(hào)。同樣,如果一個(gè)指針指向地址158(十進(jìn)制數(shù))中的一個(gè)兩字節(jié)短整型值,將該指針加3=5,結(jié)
果將是一個(gè)指向地址168(十進(jìn)制數(shù))中的短整型值的指針(見(jiàn)7.7和7.8中對(duì)指針加減運(yùn)算的詳細(xì)描述)。
街道地址的運(yùn)算只能在一個(gè)特定的街區(qū)中進(jìn)行,同樣,指針的算術(shù)運(yùn)算也只能在一個(gè)特定的數(shù)組中進(jìn)行。實(shí)際上,這并不是一種限制,因?yàn)橹羔樀乃阈g(shù)運(yùn)算只有在一個(gè)特定的數(shù)組中進(jìn)行才有意義。對(duì)指針的算術(shù)運(yùn)算來(lái)說(shuō),一個(gè)數(shù)組并不必須是一個(gè)數(shù)組變量,例如函數(shù)malloc()或calloc()的返回值是一個(gè)指針,它指向一個(gè)在堆中申請(qǐng)到的數(shù)組。
指針的說(shuō)明看起來(lái)有些使人感到費(fèi)解,請(qǐng)看下例:
char *p;
上例中的說(shuō)明表示,p是一個(gè)字符。符號(hào)“*”是指針運(yùn)算符,也稱間接引用運(yùn)算符。當(dāng)程序間接引用一個(gè)指針時(shí),實(shí)際上是引用指針?biāo)赶虻臄?shù)據(jù)。
在大多數(shù)計(jì)算機(jī)中,指針只有一種,但在有些計(jì)算機(jī)中,指向數(shù)據(jù)和指向函數(shù)的指針可以是不同的,或者指向字節(jié)(如char。指針和void *指針)和指向字的指針可以是不同的。這一點(diǎn)對(duì)sizeof運(yùn)算符沒(méi)有什么影響。但是,有些C程序或程序員認(rèn)為任何指針都會(huì)被存為一個(gè)int型的值,或者至少會(huì)被存為一個(gè)long型的值,這就無(wú)法保證了,尤其是在IBM PC兼容機(jī)上。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發(fā)布時(shí)間:2005-4-11 19:09:55
--
30.什么是間接引用(indirection)?
對(duì)已說(shuō)明的變量來(lái)說(shuō),變量名就是對(duì)變量值的直接引用。對(duì)指向變量或內(nèi)存中的任何對(duì)象的指針來(lái)說(shuō),指針就是對(duì)對(duì)象值的間接引用。如果p是一個(gè)指針,p的值就是其對(duì)象的地址;*p表示“使間接引用運(yùn)算符作用于p”,*p的值就是p所指向的對(duì)象的值。
*p是一個(gè)左值,和變量一樣,只要在*p的右邊加上賦值運(yùn)算符,就可改變*p的值。如果p是一個(gè)指向常量的指針,*p就是一個(gè)不能修改的左值,即它不能被放到賦值運(yùn)算符的左邊,請(qǐng)看下例:
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -