[英]Convert char String to an int but not possible to convert a char from an char string to an int?
char input[5] = "12345";
printf("Convert to int valid %d", atoi(input));
printf("Convert to int invalid %d", atoi(input[1])); // program crash
是否存在將char字符串的char“切片”轉換為int的解決方案? 簡短的介紹:
用戶輸入的字符串的值例如:1,2 3 4,5 Iam將該字符串格式化為12345,每個數字我都希望繼續使用數組的索引。
如果您的意思是“如何訪問char []
數組中的子字符串”,則可以使用指針算法:
char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";
幾件事要注意:
atoi
; strtol
是將字符串轉換為有符號整數的更好的函數; 看到這里了解更多信息。 另外,要將單個字符轉換為int
:
if(isdigit(c))
{
c -= '0';
}
對於C支持的每個字符集,都保證數字的文本表示形式比該數字的數值正好'0'
的關系成立。
要正確轉換任意片,您必須復制或通過在片之后插入\\0
修改字符串。 根據字符串存儲的位置,后者可能不是一個選項。
要進行復制,請分配足夠大的數組以容納切片和\\0
。 如果在編譯時知道切片的大小,則可以在堆棧上分配:
char slice[2];
否則,您將必須動態分配:
char *slice;
slice = malloc(2);
堆棧分配的切片不需要被重新分配,但動態分配的切片不再需要時應立即釋放:
free(slice);
分配切片后,復制感興趣的部分並以\\0
終止:
strncpy(slice, s + 1, 1);
slice[1] = '\0';
atoi(slice);
這項技術幾乎總是可行的。
如果您的分片始終以字符串結尾,則無需進行復制:您只需將指針傳遞給分片的開頭即可:
atoi(s + 1);
除非修改字符串本身在可寫內存中,否則可能不起作用。 如果確定是這種情況,則可以執行以下操作:
char tmp;
tmp = s[1];
s[1] = '\0';
atoi(s);
s[1] = tmp;
如果您確定但內存不可寫,則程序將出現段錯誤。
對於特殊情況,如果您的分片恰好是一個字符長,則可以使用以下事實:字符是數字:
s[0] - '0'
請注意, '0' !='\\0'
,如果您的計算機使用EBCDIC或類似版本,則此功能將無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.