我需要將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"
我需要將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"
這些函數帶有字符串參數,而不是單個字符。
如果你想要一個個性的價值,這是相當簡單:
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)
。
-1,C肯定不使用ASCII。 – unwind
@unwind:採取的點,更正。 – delicateLatticeworkFever
每個字符串元素表示一個十六進制數字。但類型是char。所以這是行不通的 – user2810168
atoi
需要字符串,所以char*
任何變體,嘗試這一個:
a[k] = atoi (str1+k);
[的atoi(http://www.cplusplus.com/reference/cstdlib/atoi/)參數類型不匹配。 –
請提供更多細節。我假設'int a [N]',但'str1'的確切類型是什麼?它是單個字符串還是一串字符串?目前還不清楚你是否想讓'a'的元素保持單個數字或整數。 – unwind
str1是一串字符串,它是串口接收到的一系列字符。 char str1 [69];每個字符串元素都代表一個十六進制數字。但類型是char。 – user2810168