2009-01-25 103 views
17

如何在C中解析一個整數到string(char* || char[])?有沒有一個等效於C中的Java的Integer.parseInt(String)方法?將整數解析爲字符串C

+0

我想你得到了另一種方式:int Integer.parseInt(String)? – 2009-01-25 23:42:57

回答

43

如果要將整數轉換爲字符串,請嘗試使用函數snprintf()

如果要將字符串轉換爲整數,請嘗試使用函數sscanf()atoi()atol()

+6

如果你想錯誤檢查,strtol或strtoul會比sscanf,atoi或atol更好。 – 2009-01-26 11:31:41

+0

`atoi`已被棄用,我不會推薦使用它。 – jacwah 2015-06-14 07:53:13

1

Java parseInt()函數解析字符串以返回一個整數。等效的C函數是atoi()。但是,這似乎不符合您的問題的第一部分。你想從一個整數轉換爲一個字符串,或從一個字符串轉換爲一個整數?

1

您還可以檢查出atoi()功能(ASCII到整數)和它的親戚,atolatoll

另外,還有一些函數,做相反的爲好,即itoa()和合作。

14

爲int轉換爲字符串:

int x = -5; 
char buffer[50]; 
sprintf(buffer, "%d", x); 

你也可以做到這一點對雙打:

double d = 3.1415; 
sprintf(buffer, "%f", d); 

將字符串轉換爲int:

int x = atoi("-43"); 

http://www.acm.uiuc.edu/webmonkeys/book/c_guide/以瞭解這些功能的文檔。

+5

你的代碼有可能發生緩衝區溢出,但我不想計算你需要有多少位的整數才能實現。使用snprintf()。 – aib 2009-01-26 00:59:47

+1

要在那裏有一個緩衝區溢出,空間爲50個字符,您將需要有163位整數,假設爲肯定的情況並存在空終止。 >>> math.log(10 ** 49)/math.log(2) 162.77447664948076 – Arafangion 2010-06-20 04:09:34

10

這聽起來像你有一個字符串,並希望將其轉換爲整數,由parseInt提來看,雖然它不是從這個問題很清楚 ...

要做到這一點,使用strtol 。這個函數比atoi稍微複雜一點,但作爲回報,它提供了一個更清楚的錯誤條件指示,因爲它可以填充一個指針(調用者提供)與第一個讓它感到困惑的字符的地址。然後調用者可以檢查違規字符並判定該字符串是否有效。 atoi,相反,如果它丟失了,返回0,這並不總是有幫助 - 但如果你對這種行爲感到滿意,那麼你也可以使用它。

strtol的示例使用如下。對錯誤的檢查非常簡單:如果第一個無法識別的字符不是結尾字符串的'\x0',則該字符串被認爲不包含有效的int。

int ParseInt(const char *s,int *i) 
{ 
    char *ep; 
    long l; 

    l=strtol(s,&ep,0); 

    if(*ep!=0) 
     return 0; 

    *i=(int)l; 
    return 1; 
} 

該函數用整數填充* i,如果字符串包含有效整數,則返回1。否則返回0.

+0

有趣的是,這名男子頁的atoi說,這是等同於: (INT)strol(STR(字符* *)NULL,10) – 2013-04-07 19:22:15

0

您可能需要查看兼容解決方案this site

0

你可以試試:

int intval; 
String stringval; 
//assign a value to intval here. 
stringval = String(intval); 

應該做的伎倆。

-1

這不是最佳解決方案。這是我的解決方案,因爲有多種限制,所以如果您根據課程/教師的指導準則有限的資源,這可能非常適合您。

另外請注意,這是我自己的項目的實施一小部分,我不得不讀操作數,以及數字,所以我用則GetChars。否則,如果你只需要整數,沒有其他類型的角色,我喜歡用這樣的:

int k; 
while (scanf("%d", &k) == 1) 

規則沒有具體的,「先進的」 C概念:沒有字符串變量,沒有結構,沒有指針,沒有方法不是蓋的,也是唯一包含我們被允許進行的#include

所以沒有簡單的方法調用類似的atoi()或提供任何字符串變量的使用,我選擇了只是蠻力它。

1:在使用的getchar讀字符(與fgets被禁止)。返回1(退出狀態1)如果 存在無效字符。對於基於Java中的parseInt的問題 1 11 13是有效的,但1 11 1a是無效的,因此對於所有值,我們都有一個有效的「字符串」,如果所有字符都是0-9,忽略空格。

2:炭的ASCII值轉換爲其整數值(例如,48 => 0。)

3:使用變量val來存儲一個int,使得對於每個字符在一個「串」有是一個相應的整數數字。即「1234」=> 1234將它附加到一個int數組並將val設置爲0以供重用。

下面的代碼演示了這種算法:

int main() { 
    int i, c; 
    int size = 0; 
    int arr[10]; //max number of ints yours may differ 
    int val = 0; 
    int chars[1200]; //arbitrary size to fit largest "String" 
    int len = 0; 

    //Part 1: read in valid integer chars from stdin 
    while((c = getchar()) != EOF && (c < 58 && c > 47)) { 
     chars[len] = c; 
     len++; 
    } 

    //Part 2: Convert atoi manually. concat digits of multi digit integers and 
    //  append to an int[] 
    for(i = 0; i < len; i++){ 
    for(i = 0; i < len; i++){ 
     if(chars[i] > 47 && chars[i] < 58){ 
     while((chars[i] > 47 && chars[i] < 58)){ 
      if(chars[i] == 48) 
       c = 0; 
      if(chars[i] == 49) 
       c = 1; 
      if(chars[i] == 50) 
       c = 2; 
      if(chars[i] == 51) 
       c = 3; 
      if(chars[i] == 52) 
       c = 4; 
      if(chars[i] == 53) 
       c = 5; 
      if(chars[i] == 54) 
       c = 6; 
      if(chars[i] == 55) 
       c = 7; 
      if(chars[i] ==56) 
       c = 8; 
      if(chars[i] == 57) 
       c = 9; 
      val = val*10 + c; 
      i++; 
     } 
     arr[size] = val; 
     size++; 
     if(size > 10) //we have a check to ensure size stays in bounds 
      return 1; 
     val = 0; 
     } 
     //Print: We'll make it a clean, organized "toString" representation 
     printf("["); 
     for(i = 0; i < size-1; i++){ 
      printf("%d, ", arr[i]); 
     } 
     printf("%d]", arr[i]; 

     return 0; 

再次,這是蠻力方法,但是像我這樣的,你不能用專業的人使用的方法的概念或多種C99工具的情況下,這可能是你在找什麼。