2016-04-29 240 views
-2

嗨,我有下面的代碼,出於某種原因,我得到了錯誤,似乎無法解決原因。將char *轉換爲int

warning: return makes integer from pointer without a cast 

的代碼,我是:

long convertToInt(char *convert) { 
     char *p = convert; 
     while(*p){ 
      if(isdigit(*p)) { 
       long val = strtol(p, &p, 10); 
       return val; 
      } else { 
       p++; 
      } 
     } 
    return NULL; 
} 
+0

你爲什麼要一個指針轉換爲整數? – Olaf

+7

有一種代碼異味,它是一個'convertToInt',意思是一個int,不是很長,這是誤導。 – t0mm13b

+0

你能否展示你打算如何使用'convertToInt'函數?答案可能取決於此。 –

回答

2

NULL是一個指針,不是一個整數。它可以實現爲一個#define,它擴展爲0(整數常量)或((void *)0)空指針常量。如果你想返回一個意味着「發生錯誤」的值,你可能想要返回一個整數常量。值0和-1是傳統的。

更好的是爲成功/失敗返回一個布爾狀態值,並通過指針參數返回值:bool_t convertToInt(const char *s, long *value)。例如,請參閱標準庫函數strtol

+1

'bool_t'?我想你的意思是'布爾'。 – unwind

+1

是的,布爾,而不是bool_t。 – 2016-04-29 13:00:18

1

你funtion返回long。因此,改變return語句:的NULL

return 0L; 

一個可能的定義是(void *)0正在被轉化爲long當你return

0

的問題是在這裏:

return NULL; 

,你回NULL,但該函數的返回類型是long


而且你的函數被命名爲convertToInt(),但它返回一個long,這將意味着一個convertToLong()函數名。

1

正確的代碼會是這樣,假設convert與數字的字符串:

long convertToLong(char *convert) { 
    long val = 0L; 
    char *p = convert; 
    while (isdigit(*p)){ 
     val = val * 10 + (*p - '0'); 
     p++; 
    } 
    return val; 
}