2012-04-18 50 views
19

我想轉換字符數組[]等:轉換字符數組到整型數字用C

char myarray[4] = {'-','1','2','3'}; //where the - means it is negative 

所以它應該是整數:使用標準 libaries -1234 在Ç。我找不到任何優雅的方式來做到這一點。

我可以肯定附加'\ 0'。

+2

1.你缺少'4' 2.你的數組是否有空終止符? – MByD 2012-04-18 07:03:50

+2

是否有可能在數組末尾附加一個額外的''\ 0'?然後我們立即完成。 – 2012-04-18 07:04:02

+8

那是因爲沒有。儘管有nul終止字符串的方法。 'atoi'和'strtol'是兩種選擇。 'char myarray [] = {' - ','1','2','3','4',0}; 'I = atoi(myarray);' – falstro 2012-04-18 07:04:18

回答

50

我個人不喜歡atoi函數。我建議sscanf

char myarray[5] = {'-', '1', '2', '3', '\0'}; 
int i; 
sscanf(myarray, "%d", &i); 

這是非常標準的,它在stdio.h庫:)

,在我看來,它可以讓你比atoi更多的自由,你的電話號碼字符串的任意格式,並可能還允許在最後使用非數字字符。

編輯 我剛剛發現這個奇妙question在這裏,介紹並比較3點不同的方式來做到這一點的網站上 - atoisscanfstrtol。此外,還有一個很好的更詳細的洞察sscanf(實際上,*scanf功能的整個家庭)。

EDIT2 看起來這不僅僅是我個人不喜歡atoi函數。下面是一個link的答案,解釋atoi函數已被棄用,不應在較新的代碼中使用。

+4

degustibus ... sscanf在一個簡單的任務(變量列表參數,格式字符串解析)上增加了一個整體開銷,而且恕我直言更容易出錯。對於簡單的任務,我更喜歡使用簡單的函數(atoi是出於這個原因) – BigMike 2012-04-18 07:17:44

+0

@BigMike當我很少,剛剛開始'C',有人向我解釋爲什麼使用'atoi'不是更好。從那以後,我忘記了原因,但我從不喜歡使用它...現在我正在查看它們,並且我被提醒了它們。我編輯了一個指向atoi問題的鏈接,並將其與其他將字符串轉換爲int的方法進行了比較。 – penelope 2012-04-18 07:25:23

+2

拒絕atoi的唯一原因是與線程安全的東西有關,strtol仍然比sscanf更適合於簡單的任務。重點不在於使用atoi或int foo(char *)是針對複雜函數使用平凡的函數。剩下的只是一個品味問題。sscanf確實做了它的工作,簡直就是浪費在這樣一個微不足道的任務上。當我學習編程時,不要忘記4/5週期的時鐘是必須的。如果更多的人堅持這一點,現在應用程序將以光速運行。 – BigMike 2012-04-18 07:30:58

6

爲什麼不只是使用atoi?例如:

char myarray[4] = {'-','1','2','3'}; 

int i = atoi(myarray); 

printf("%d\n", i); 

給我,正如預期:

-123 

更新:爲什麼不 - 字符數組不是空終止。衛生署!

+6

不完全是一個好選擇。它純粹運氣好運。該數組不是空終止,所以不可預知的resulst可能來自atoi – BigMike 2012-04-18 07:08:08

+0

是的。我剛剛意識到這一點。 ;-) – 2012-04-18 07:08:37

+0

謝謝!我錯過了'\ 0'。我使用動態數組,所以我只是增加了一個額外的位置。 – SpcCode 2012-04-18 07:25:49

1

所以,這個想法是將字符數字(用單引號,例如'8')轉換爲整數表達式。例如char c ='8'; int i = c - '0'//會產生整數8;並且按照908 = 9 * 100 + 0 * 10 + 8的原則對所有轉換後的數字進行總結,循環完成。

char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly. 

int s = 1; 
int i = -1; 
int res = 0; 

if (c[0] == '-') { 
    s = -1; 
    i = 0; 
} 

while (c[++i] != '\0') { //iterate until the array end 
    res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers. 
} 

res = res*s; //answer: -908 
+0

呵呵,以爲這是自我描述。 – ottoshmidt 2015-05-23 19:38:35

+0

如果你打算添加''\ 0'',那麼使用標準庫真的會更好(請參閱其他答案)。如果你不能有終止的NUL字節(改變循環條件),這種方法會很有用。 – hyde 2015-05-23 19:58:20

+0

是的,我想出了一個沒有使用圖書館。 – ottoshmidt 2015-05-24 14:39:16

1

在沒有將數組轉換爲字符串的情況下處理字符數組本身並不難。特別是在字符數組的長度已知或容易找到的情況下。隨着字符數組,長度必須在同一範圍內數組定義,例如:

size_t len sizeof myarray/sizeof *myarray; 

對於字符串來確定你的,當然,有strlen可用。

在已知長度,不管它是否是一個字符數組或字符串,可以將字符值轉換爲數字,並顯示類似以下短函數:

/* convert character array to integer */ 
int char2int (char *array, size_t n) 
{  
    int number = 0; 
    int mult = 1; 

    n = (int)n < 0 ? -n : n;  /* quick absolute value check */ 

    /* for each character in array */ 
    while (n--) 
    { 
     /* if not digit or '-', check if number > 0, break or continue */ 
     if ((array[n] < '0' || array[n] > '9') && array[n] != '-') { 
      if (number) 
       break; 
      else 
       continue; 
     } 

     if (array[n] == '-') {  /* if '-' if number, negate, break */ 
      if (number) { 
       number = -number; 
       break; 
      } 
     } 
     else {      /* convert digit to numeric value */ 
      number += (array[n] - '0') * mult; 
      mult *= 10; 
     } 
    } 

    return number; 
} 

上面是簡單的標準的char到int轉換方法,幷包含一些額外的條件。除了digits'-'之外,要處理雜散字符,唯一的技巧就是明智地選擇何時開始收集數字以及何時停止。

如果您在遇到第一個digit時開始收集digits進行轉換,那麼當您遇到第一個'-'non-digit時轉換結束。當對諸如(例如file_0127.txt)的索引感興趣時,這使得轉換更加方便。

其使用的簡單例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int char2int (char *array, size_t n); 

int main (void) { 

    char myarray[4] = {'-','1','2','3'}; 
    char *string = "some-goofy-string-with-123-inside"; 
    char *fname = "file-0123.txt"; 

    size_t mlen = sizeof myarray/sizeof *myarray; 
    size_t slen = strlen (string); 
    size_t flen = strlen (fname); 

    printf ("\n myarray[4] = {'-','1','2','3'};\n\n"); 
    printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen)); 

    printf (" string = \"some-goofy-string-with-123-inside\";\n\n"); 
    printf (" char2int (string, slen) : %d\n\n", char2int (string, slen)); 

    printf (" fname = \"file-0123.txt\";\n\n"); 
    printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen)); 

    return 0; 
} 

注:當面對'-'分隔的文件索引(或類似),它是由你來否定結果。 (例如file-0123.txt與相比較,其中第一個將返回-123而第二個123)。

示例輸出

$ ./bin/atoic_array 

myarray[4] = {'-','1','2','3'}; 

    char2int (myarray, mlen): -123 

string = "some-goofy-string-with-123-inside"; 

    char2int (string, slen) : -123 

fname = "file-0123.txt"; 

    char2int (fname, flen) : -123 

注:總有邊界情況等,可能會導致問題。這並不意味着在所有字符集等方面100%無懈可擊,而是在絕大多數時間工作,並提供額外的轉換靈活性,而無需atoistrtol等所需的字符串的初始分析或轉換。