C標準庫 數值字串轉換與記憶體分配函式

2021-09-08 11:44:13 字數 1993 閱讀 6507

一、數值字串轉換函式

#include int atoi(const char *nptr);

double atof(const char *nptr);

返回值:轉換結果

atoi把乙個字串開頭可以識別成十進位制整數的部分轉換成int型,例如atoi("   -123abc")返回-123(字串開頭可以有空格)。如果字串開頭沒有可識別的整數返回0,而atoi("0abc")也返回0。(atoi("abc123")返回0)atof把乙個字串開頭可以識別成浮點數的部分轉換成double型,如:atof("31.4 ")返回31.4。atoi與atof都不能檢查出錯的情況。

#include long int strtol(const char *nptr, char **endptr, int base);

double strtod(const char *nptr, char **endptr);

返回值:轉換結果,出錯時設定errno

strtol是atoi的增強版,主要體現在這幾方面:

(1) 不僅可以識別十進位制整數,還可以識別其它進製的整數,取決於base引數,比如strtol("0xdeadbee~~", null, 16)返回0xdeadbee的值,strtol("0777~~", null, 8)返回0777的值。

(2)endptr是乙個傳出引數,函式返回時指向後面未被識別的第乙個字元。例如char *pos;strtol("123abc", &pos, 10);,strtol返回123,pos指向字串中的字母a。如果字串開頭沒有可識別的整數,例如char *pos; strtol("abcabc", &pos, 10);,則strtol返回0,pos指向字串開頭,可以據此判斷這種出錯的情況,而這是atoi處理不了的。

(3)如果字串中的整數值超出long int的表示範圍(上溢或下溢),則strtol返回它所能表示的最大(或最小)整數,並設定errno為erange,例如strtol("0xdeadbeef~~", null,16)返回0x7fffffff並設定errno為erange。

二、記憶體分配函式

除了使用malloc()可以在堆分配記憶體外還有其他函式可以:

#include void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

calloc的引數很像fread/fwrite的引數,分配nmemb個元素的記憶體空間,每個元素佔size位元組,並且calloc負責把這塊記憶體空間用位元組0填充,而malloc並不負責把分配的記憶體空間清零。

有時候用malloc或calloc分配的記憶體空間使用了一段時間之後需要改變它的大小,一種辦法是呼叫malloc分配一塊新的記憶體空間,把原記憶體空間中的資料拷到新的記憶體空間,然後呼叫free釋放原記憶體空間。使用realloc函式簡化了這些步驟,把原記憶體空間的指標ptr傳給realloc,通過引數size指定新的大小(位元組數),realloc返回新記憶體空間的首位址,並釋放原記憶體空間。新記憶體空間中的資料盡量和原來保持一致,如果size比原來小,則前size個位元組不變,後面的資料被截斷,如果size比原來大,則原來的資料全部保留,後面長出來的一塊記憶體空間未初始化(realloc不負責清零)。注意,引數ptr要麼是null,要麼必須是先前呼叫malloc、calloc或realloc返回的指標,不能把任意指標傳給realloc要求重新分配記憶體空間。作為兩個特例,如果呼叫realloc(null, size),則相當於呼叫malloc(size),如果呼叫realloc(ptr, 0),ptr不是null,則相當於呼叫free(ptr)。

#include void *alloca(size_t size);
引數size是請求分配的位元組數,alloca函式不是在堆上分配空間,而是在呼叫者函式的棧幀上分配空間,類似於c99的變長陣列,當呼叫者函式返回時自動釋放棧幀,所以不需要free。這個函式不屬於c標準庫,而是在posix標準中定義的。

C 中數值 字串間的轉換

編寫 時經常需要在數值 int,long,float,double 與字串間的相互轉換。c c 中相關的轉換方法主要有如下幾種 一 使用crt庫中的轉換函式族。缺點 轉換函式較多,命名不統一以致難以記住,使用不方便。二 借助c 98標準中的stringstream模板類實現。數值到字串的轉換可如下實...

C 中數值 字串間的轉換

編寫 時經常需要在數值 int,long,float,double 與字串間的相互轉換。c c 中相關的轉換方法主要有如下幾種 一 使用crt庫中的轉換函式族。缺點 轉換函式較多,命名不統一以致難以記住,使用不方便。二 借助c 98標準中的stringstream模板類實現。數值到字串的轉換可如下實...

C 資料型別轉換 數值字串和數值之間的轉換

首先,我們得搞明白,什麼是數值字串。我們知道,在 c 中,字串是用一對雙引號包含的若干字元來表示的,如 123 而 123 又相對特殊,因為組成該字串的字元都是數字,這樣的字串,就是數值字串。在我們的眼中,123 即是一串字元,也是乙個數,但計算機卻只認為它是乙個字串,不是數。因此,我們在某些時候,...