我想轉換字符數組[]等:轉換字符數組到整型數字用C
char myarray[4] = {'-','1','2','3'}; //where the - means it is negative
所以它應該是整數:使用標準 libaries -1234 在Ç。我找不到任何優雅的方式來做到這一點。
我可以肯定附加'\ 0'。
我想轉換字符數組[]等:轉換字符數組到整型數字用C
char myarray[4] = {'-','1','2','3'}; //where the - means it is negative
所以它應該是整數:使用標準 libaries -1234 在Ç。我找不到任何優雅的方式來做到這一點。
我可以肯定附加'\ 0'。
我個人不喜歡atoi
函數。我建議sscanf
:
char myarray[5] = {'-', '1', '2', '3', '\0'};
int i;
sscanf(myarray, "%d", &i);
這是非常標準的,它在stdio.h
庫:)
,在我看來,它可以讓你比atoi
更多的自由,你的電話號碼字符串的任意格式,並可能還允許在最後使用非數字字符。
編輯 我剛剛發現這個奇妙question在這裏,介紹並比較3點不同的方式來做到這一點的網站上 - atoi
,sscanf
和strtol
。此外,還有一個很好的更詳細的洞察sscanf
(實際上,*scanf
功能的整個家庭)。
EDIT2 看起來這不僅僅是我個人不喜歡atoi
函數。下面是一個link的答案,解釋atoi
函數已被棄用,不應在較新的代碼中使用。
degustibus ... sscanf在一個簡單的任務(變量列表參數,格式字符串解析)上增加了一個整體開銷,而且恕我直言更容易出錯。對於簡單的任務,我更喜歡使用簡單的函數(atoi是出於這個原因) – BigMike 2012-04-18 07:17:44
@BigMike當我很少,剛剛開始'C',有人向我解釋爲什麼使用'atoi'不是更好。從那以後,我忘記了原因,但我從不喜歡使用它...現在我正在查看它們,並且我被提醒了它們。我編輯了一個指向atoi問題的鏈接,並將其與其他將字符串轉換爲int的方法進行了比較。 – penelope 2012-04-18 07:25:23
拒絕atoi的唯一原因是與線程安全的東西有關,strtol仍然比sscanf更適合於簡單的任務。重點不在於使用atoi或int foo(char *)是針對複雜函數使用平凡的函數。剩下的只是一個品味問題。sscanf確實做了它的工作,簡直就是浪費在這樣一個微不足道的任務上。當我學習編程時,不要忘記4/5週期的時鐘是必須的。如果更多的人堅持這一點,現在應用程序將以光速運行。 – BigMike 2012-04-18 07:30:58
爲什麼不只是使用atoi?例如:
char myarray[4] = {'-','1','2','3'};
int i = atoi(myarray);
printf("%d\n", i);
給我,正如預期:
-123
更新:爲什麼不 - 字符數組不是空終止。衛生署!
所以,這個想法是將字符數字(用單引號,例如'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
呵呵,以爲這是自我描述。 – ottoshmidt 2015-05-23 19:38:35
如果你打算添加''\ 0'',那麼使用標準庫真的會更好(請參閱其他答案)。如果你不能有終止的NUL字節(改變循環條件),這種方法會很有用。 – hyde 2015-05-23 19:58:20
是的,我想出了一個沒有使用圖書館。 – ottoshmidt 2015-05-24 14:39:16
在沒有將數組轉換爲字符串的情況下處理字符數組本身並不難。特別是在字符數組的長度已知或容易找到的情況下。隨着字符數組,長度必須在同一範圍內數組定義,例如:
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%無懈可擊,而是在絕大多數時間工作,並提供額外的轉換靈活性,而無需atoi
或strtol
等所需的字符串的初始分析或轉換。
1.你缺少'4' 2.你的數組是否有空終止符? – MByD 2012-04-18 07:03:50
是否有可能在數組末尾附加一個額外的''\ 0'?然後我們立即完成。 – 2012-04-18 07:04:02
那是因爲沒有。儘管有nul終止字符串的方法。 'atoi'和'strtol'是兩種選擇。 'char myarray [] = {' - ','1','2','3','4',0}; 'I = atoi(myarray);' – falstro 2012-04-18 07:04:18