?? c.txt
字號:
/ * 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
-- 發布時間:2005-4-9 23:46:23
--
28.怎樣將數字轉換為字符串?
C語言提供了幾個標準庫函數,可以將任意類型(整型、長整型、浮點型等)的數字轉換為字符串。以下是用itoa()函數將整數轉換為字符串的一個例子:
# 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()函數有3個參數:第一個參數是要轉換的數字,第二個參數是要寫入轉換結果的目標字符串,第三個參數是轉移數字時所用的基數。在上例中,轉換基數為10。
下列函數可以將整數轉換為字符串:
----------------------------------------------------------
函數名 作 用
----------------------------------------------------------
itoa() 將整型值轉換為字符串
itoa() 將長整型值轉換為字符串
ultoa() 將無符號長整型值轉換為字符串
----------------------------------------------------------
請注意,上述函數與ANSI標準是不兼容的。能將整數轉換為字符串而且與ANSI標準兼容的方法是使用sprintf()函數,請看下例:
#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);
}
在將浮點型數字轉換為字符串時,需要使用另外一組函數。以下是用fcvt()函數將浮點型值轉換為字符串的一個例子:
# 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()函數和itoa()函數有數大的差別。fcvt()函數有4個參數:第一個參數是要轉換的浮點型值;第二個參數是轉換結果中十進制小數點右側的位數;第三個參數是指向一個整數的指針,該整數用來返回轉換結果中十進制小數點的位置;第四個參數也是指向一個整數的指針,該整數用來返回轉換結果的符號(0對應于正值,1對應于負值)。
需要注意的是,fcvt()函數的轉換結果中并不真正包含十進制小數點,為此,fcvt()函數返回在轉換結果中十進制小數點應該占據的位置。在上例中,整型變量dec_pl的結果值為5,因為在轉換結果中十進制小數點應該位于第5位后面。如果你要求轉換結果中包含十進制小數點,你可以使用gcvt()函數(見下表)。
下列函數可以將浮點型值轉換為字符串:
-------------------------------------------------------------------------
函數名 作 用
-------------------------------------------------------------------------
ecvt() 將雙精度浮點型值轉換為字符串,轉換結果中不包含十進制小數點
fcvt() 以指定位數為轉換精度,余同ecvt()
gcvt() 將雙精度浮點型值轉換為字符串,轉換結果中包含十進制小數點
-------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-10 0:12:02
--
29.怎樣將字符串轉換為數字?
C語言提供了幾個標準庫函數,可以將字符串轉換為任意類型(整型、長整型、浮點型等)的數字。以下是用atoi()函數將字符串轉換為整數的一個例子:
# 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()函數只有一個參數,即要轉換為數字的字符串。atoi()函數的返回值就是轉換所得的整型值。
下列函數可以將字符串轉換為數字:
------------------------------------------------------------------------
函數名 作 用
------------------------------------------------------------------------
atof() 將字符串轉換為雙精度浮點型值
atoi() 將字符串轉換為整型值
atol() 將字符串轉換為長整型值
strtod() 將字符串轉換為雙精度浮點型值,并報告不能被轉換的所有剩余數字
strtol() 將字符串轉換為長整值,并報告不能被轉換的所有剩余數字
strtoul() 將字符串轉換為無符號長整型值,并報告不能被轉換的所有剩余數字
------------------------------------------------------------------------
將字符串轉換為數字時可能會導致溢出,如果你使用的是strtoul()這樣的函數,你就能檢查這種溢出錯誤。請看下例:
# 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);
}
在上例中,要轉換的字符串太長,超出了無符號長整型值的取值范圍,因此,strtoul()函數將返回ULONG_MAX(4294967295),并使。char leftover指向字符串中導致溢出的那部分字符;同時,strtoul()函數還將全局變量errno賦值為ERANGE,以通知函數的調用者發生了溢出錯誤。函數strtod()和strtol()處理溢出錯誤的方式和函數strtoul()完全相同,你可以從編譯程序文檔中進一步了解這三個函數的有關細節。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-11 19:06:22
--
以下關于指針的內容希望大家能認真仔細地看 相信不論你是高手還是入門者 都將對你受用不小
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-11 19:08:52
--
由于指針在C語言學習中確實存在一定難度 那么我就先引入些有關指針的基礎知識讓各位回顧一下
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-11 19:09:27
--
指針為C語言編程提供了強大的支持——如果你能正確而靈活地利用指針,你就可以直接切入問題的核心,或者將程序分割成一個個片斷。一個很好地利用了指針的程序會非常高效、簡潔和精致。
利用指針你可以將數據寫入內存中的任意位置,但是,一旦你的程序中有一個野指針("wild”pointer),即指向一個錯誤位置的指針,你的數據就危險了——存放在堆中的數據可能會被破壞,用來管理堆的數據結構也可能會被破壞,甚至操作系統的數據也可能會被修改,有時,上述三種破壞情況會同時發生。
此后可能發生的事情取決于這樣兩點:第一,內存中的數據被破壞的程度有多大;第二,內存中的被破壞的部分還要被使用多少次。在有些情況下,一些函數(可能是內存分配函數、自定義函數或標準庫函數)將立即(也可能稍晚一點)無法正常工作。在另外一些情況下,程序可能會終止運行并報告一條出錯消息;或者程序可能會掛起;或者程序可能會陷入死循環;或者程序可能會產生錯誤的結果;或者程序看上去仍在正常運行,因為程序沒有遭到本質的破壞。
值得注意的是,即使程序中已經發生了根本性的錯誤,程序有可能還會運行很長一段時間,然后才有明顯的失常表現;或者,在調試時,程序的運行完全正常,只有在用戶使用時,它才會失常。
在C語言程序中,任何野指針或越界的數組下標(out-of-bounds array subscript)都可能使系統崩潰。兩次釋放內存的操作也會導致這種結果。你可能見過一些C程序員編寫的程序中有嚴重的錯誤,現在你能知道其中的部分原因了。
有些內存分配工具能幫助你發現內存分配中存在的問題,例如漏洞(leak,見7.21),兩次釋放一個指針,野指針,越界下標,等等。但這些工具都是不通用的,它們只能在特定的操作系統中使用,甚至只能在特定版本的編譯程序中使用。如果你找到了這樣一種工具,最好試試看能不能用,因為它能為你節省許多時間,并能提高你的軟件的質量。
指針的算術運算是C語言(以及它的衍生體,例如C++)獨有的功能。匯編語言允許你對地址進行運算,但這種運算不涉及數據類型。大多數高級語言根本就不允許你對指針進行任何操作,你只能看一看指針指向哪里。
C指針的算術運算類似于街道地址的運算。假設你生活在一個城市中,那里的每一個街區的所有街道都有地址。街道的一側用連續的偶數作為地址,另一側用連續的奇數作為地址。如果你想知道River Rd.街道158號北邊第5家的地址,你不會把158和5相加,去找163號;你會先將5(你要往前數5家)乘以2(每家之間的地址間距),再和158相加,去找River Rd.街道的168號。同樣,如果一個指針指向地址158(十進制數)中的一個兩字節短整型值,將該指針加3=5,結
果將是一個指向地址168(十進制數)中的短整型值的指針(見7.7和7.8中對指針加減運算的詳細描述)。
街道地址的運算只能在一個特定的街區中進行,同樣,指針的算術運算也只能在一個特定的數組中進行。實際上,這并不是一種限制,因為指針的算術運算只有在一個特定的數組中進行才有意義。對指針的算術運算來說,一個數組并不必須是一個數組變量,例如函數malloc()或calloc()的返回值是一個指針,它指向一個在堆中申請到的數組。
指針的說明看起來有些使人感到費解,請看下例:
char *p;
上例中的說明表示,p是一個字符。符號“*”是指針運算符,也稱間接引用運算符。當程序間接引用一個指針時,實際上是引用指針所指向的數據。
在大多數計算機中,指針只有一種,但在有些計算機中,指向數據和指向函數的指針可以是不同的,或者指向字節(如char。指針和void *指針)和指向字的指針可以是不同的。這一點對sizeof運算符沒有什么影響。但是,有些C程序或程序員認為任何指針都會被存為一個int型的值,或者至少會被存為一個long型的值,這就無法保證了,尤其是在IBM PC兼容機上。
--------------------------------------------------------------------------------
-- 作者:PrOve
-- 發布時間:2005-4-11 19:09:55
--
30.什么是間接引用(indirection)?
對已說明的變量來說,變量名就是對變量值的直接引用。對指向變量或內存中的任何對象的指針來說,指針就是對對象值的間接引用。如果p是一個指針,p的值就是其對象的地址;*p表示“使間接引用運算符作用于p”,*p的值就是p所指向的對象的值。
*p是一個左值,和變量一樣,只要在*p的右邊加上賦值運算符,就可改變*p的值。如果p是一個指向常量的指針,*p就是一個不能修改的左值,即它不能被放到賦值運算符的左邊,請看下例:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -