在 C 語言中轉換 Char*為 Int

Jinku Hu 2023年10月12日
  1. 使用 strtol 函式在 C 語言中把 char*轉換為 int
  2. 在 C 語言中正確驗證 strtol 函式將 char*轉換為 int 的結果
在 C 語言中轉換 Char*為 Int

本文將介紹幾種在 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Integer