簡體   English   中英

將char字符串轉換為int,但無法將char從char字符串轉換為int嗎?

[英]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";

幾件事要注意:

  1. 您的數組應為6個元素,以容納空終止符
  2. 根本不應該使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM