2012-11-25 23 views
-1

我試圖將此字符串"09195462965"轉換爲int,但我遇到了問題。Linux的C字符串到INT

片斷我的代碼:

int n, p, pnum=0; 
char buffer[256]; 
char *endptr; 
long pnumber; 

bzero(buffer,256); 
p = read(sock,buffer,255); 

    pnumber = strtol(buffer, &endptr, pnum); 

printf("n: %ld",pnumber); 

p = write(sock,buffer,sizeof(buffer)); 

客戶端發送的"09195462965"一個字符串,然後服務器接收它。

現在在服務器上,字符串必須變成int09195462965

注意:服務器將字符串作爲字符串發送。

+3

問題是? –

+1

問題是什麼? –

+0

我不認爲int的最大尺寸大於09195462965. – cipher

回答

3

您錯誤地使用了strtol(),最後一個參數應該是您想要的基礎。例如,如果你想存儲在基數10(十進制),這個數字:

long pnumber; 
pnumber = strtol("09195462965", NULL, 10); //nst char *nptr is "09195462965" 
              //char **endptr is null 
              //int base  is 10 for decimal 
printf("n: %ld",pnumber); 

>> 9195462965 

請務必閱讀man page爲您所使用的功能。

傳遞pnum(被設置爲0)爲你做的最後一個參數是導致它吐回「0」,這是因爲一些你進入。此外,

09195462965具有從0〜位數9(所以我假設你想要十二月)如果你通過「0」到strtol()那麼它會看到第一個0,並將視爲數字爲八進制,問題在於八進制數字從0-7,因此9's是「越界」的八進制數,因此strtol()吐出0.

與數字如:07175462765,你會沒事的當它是0時通過pnum

+1

*如果base的值爲0,則主題序列的預期形式是整數常量的形式,如[...]中所述*所以'如果該數字被解釋爲八進制數,base = 0可能是該操作符後面的內容。我只是添加了報價,因爲你發佈在你的答案***確保你閱讀手冊頁... ***;) – cnicutar

+0

@cnicutar - 哦,不用擔心,我只是沒有解釋*爲什麼*字符串在'pnum = 0'時是無效的,因爲我認爲OP會閱讀man手冊並找出它。 ;)但我現在更新它。 – Mike

1

這太大了,不適合int。嘗試strtoumax並將其存儲在uintmax_t中。

uintmax_t pnumber = strtoumax(buffer, &endptr, 10); 
if (pnumber == UINTMAX_MAX && errno == ERANGE) 
    /* Too big. */ 

另外,如果你沒有strtoumax你可以嘗試strtoull等。