在 C 語言中轉換 Char*為 Int
Jinku Hu
2023年10月12日
本文將介紹幾種在 C 語言中如何將 char*
轉換為 int 的方法。
使用 strtol
函式在 C 語言中把 char*
轉換為 int
strtol
函式是 C 標準庫的一部分,它可以將 char*
資料轉換成使用者指定的長整數值。該函式需要 3 個引數,其中第一個引數是字串所在的指標。注意,這個 char
指標引數是不被修改的,有一個 const
限定符。第二個引數可以利用它來儲存遇到的第一個無效字元,或者在沒有找到數字的情況下儲存整個字串。第三個引數指定要轉換的數字的基數,這個引數的值應該在 2 和 36 之間。下面的例子顯示瞭如何將 char*
陣列中的元素轉換為整數並輸出到控制檯。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
char *arr[] = {"12", "33", "43", "23", "90"};
size_t len = sizeof arr / sizeof arr[0];
long int arr3[len];
for (int i = 0; i < len; ++i) {
arr3[i] = strtol(arr[i], NULL, 10);
}
printIntegers(arr3, len);
exit(EXIT_SUCCESS);
}
輸出:
12 | 33 | 43 | 23 | 90 |
作為另一種選擇,我們可以將程式引數作為輸入字串,並將其轉換為整數型別。注意,我們需要使用 int argc,char* argv[]
作為 main
函式的引數來訪問程式引數並進行處理。接下來的示例程式碼將檢查使用者提供的程式引數是否至少是單一引數,如果不是,則退出顯示相應的錯誤資訊。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int arr2[argc - 1];
for (int i = 0; i < argc - 1; ++i) {
arr2[i] = strtol(argv[i + 1], NULL, 10);
}
printIntegers(arr2, argc - 1);
exit(EXIT_SUCCESS);
}
在 C 語言中正確驗證 strtol
函式將 char*
轉換為 int
的結果
即使我們在前面的例子中成功地使用 strtol
呼叫將作為程式引數傳遞的字串轉換為整數,但給定的程式仍有很大的可能性會失敗。建議為 strtol
函式呼叫實現錯誤檢查例程,以保證程式的穩健執行並有相應的錯誤記錄。我們將檢查轉換後的整數是否在 long
型別的範圍內,以及轉換本身是否不成功。此外,我們還會檢查有效整數後面是否有字元,給定的輸入是否是十進位制數。不過請注意,在每種情況下,我們都會將錯誤資訊列印到 stderr
流中,而不會終止程式,但你應該根據你的需求考慮另一個處理例程。
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int num;
char *endptr, *str = argv[1];
errno = 0;
long ret = strtol(str, &endptr, 10);
if (str == endptr) {
fprintf(stderr, "%s: not a decimal number\n", str);
} else if ('\0' != *endptr) {
fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
} else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
fprintf(stderr, "%s out of range of type long\n", str);
} else if (errno != 0 && ret == 0) {
fprintf(stderr, "%s no conversion was performed\n", str);
} else {
num = ret;
printf("num: %ld\n", num);
}
exit(EXIT_SUCCESS);
}
作者: Jinku Hu