2013-09-24 67 views
0

我需要將char格式的字符串元素轉換爲我項目中的int格式數組。 我用下面的函數,但我得到了錯誤後編譯:將字符串元素轉換爲int數組中的元素c

a[k] = atoi (str1[k]); 
a[k] = strtol(str1[k],NULL,16); 

K是作爲一個計數器。

error: #167: argument of type "char" is incompatible with parameter of type "const char *restrict"

+1

[的atoi(http://www.cplusplus.com/reference/cstdlib/atoi/)參數類型不匹配。 –

+0

請提供更多細節。我假設'int a [N]',但'str1'的確切類型是什麼?它是單個字符串還是一串字符串?目前還不清楚你是否想讓'a'的元素保持單個數字或整數。 – unwind

+0

str1是一串字符串,它是串口接收到的一系列字符。 char str1 [69];每個字符串元素都代表一個十六進制數字。但類型是char。 – user2810168

回答

0

strtolatoi需要一個字符數組(char*然後)作爲轉化輸入(一個整數可以在多個字符進行編碼)的地址。 正確的使用方法:

a[k] = atoi (&str1[k]); 
a[k] = strtol(&str1[k],NULL,16); 
0

這些函數帶有字符串參數,而不是單個字符。

如果你想要一個個性的價值,這是相當簡單:

a[k] = str1[k] - '0'; 

如果str[k]是數字「7」的a[k]整數值將是7

此用途'0'字符的值,假定執行字符集給出'0' - '9'連續值。這是一個安全的假設,因爲它是由(例如)所規定的ISO C99草案的5.2.1.3:

在源和執行基本字符集兩者的 每個字符之後0在上述列表中的值的十進制數字應該是 ,比先前的值大1。

即,如果 '0' == 48,然後 '1' == 49等


如果只想一個整數的值,該值在字符串在開頭str[k],使用運營商的地址:

a[k] = strtol(&str1[k],NULL,16); 

如果需要使用十六進制數字的工作,你可以假設ŧ你的執行字符集也會依次編碼'a'到'f',這是一個非常安全的假設(ASCII和unicode以及其他所有常見編碼都是這樣做的)。然後你可以使用一個函數來測試值的範圍,並根據該值進行賦值(如果在'0'和'9'之間,減去'0',如果在'a'和'f'之間,減去'a')。但如果你是真的真的偏執,你可以創建一個查找表:

char hexDigitLookup[256]; // The normal range of a char. 
memset(hexDigitLookup, -1, 256); 
hexDigitLookup['0'] = 0; 
hexDigitLookup['1'] = 1; 
hexDigitLookup['2'] = 2; 
hexDigitLookup['3'] = 3; 
hexDigitLookup['4'] = 4; 
hexDigitLookup['5'] = 5; 
hexDigitLookup['6'] = 6; 
hexDigitLookup['7'] = 7; 
hexDigitLookup['8'] = 8; 
hexDigitLookup['9'] = 9; 
hexDigitLookup['a'] = 10; 
hexDigitLookup['b'] = 11; 
hexDigitLookup['c'] = 12; 
hexDigitLookup['d'] = 13; 
hexDigitLookup['e'] = 14; 
hexDigitLookup['f'] = 15;  

所以,a[k] = hexDigitLookup[str1[k]]將產生正確的值,如果str[k]是一個十六進制數字,否則爲-1,不管如何執行字符集是佈局。當然,您應該首先檢查str[k]是不是< 0,當解析時它可能是這樣的。 Unicode格式。你可以改爲鑄造(unsigned char)

+0

-1,C肯定不使用ASCII。 – unwind

+0

@unwind:採取的點,更正。 – delicateLatticeworkFever

+0

每個字符串元素表示一個十六進制數字。但類型是char。所以這是行不通的 – user2810168

0

atoi需要字符串,所以char*任何變體,嘗試這一個:

a[k] = atoi (str1+k); 
相關問題