在C语言(-std=gnu89标准)中将超大字符数组转换为整数
超大数字字符串转整数的GNU89兼容方案
方案一:使用GNU扩展__int128类型
由于你使用-std=gnu89标准,GNU提供的__int128扩展类型可以轻松处理你的目标数字(其最大值约为1.7e38,远大于你给出的1.7e21)。标准库没有直接的字符串转__int128函数,手动实现即可:
#include <stdio.h> #include <ctype.h> __int128 str_to_int128(const char *str) { __int128 result = 0; int sign = 1; // 跳过前置空白字符 while (isspace((unsigned char)*str)) { str++; } // 处理正负号 if (*str == '-' || *str == '+') { sign = (*str == '-') ? -1 : 1; str++; } // 逐位转换为__int128 while (isdigit((unsigned char)*str)) { result = result * 10 + (*str - '0'); str++; } return result * sign; } // 辅助打印__int128(标准库printf不直接支持该类型) void print_int128(__int128 num) { if (num < 0) { putchar('-'); num = -num; } if (num > 9) { print_int128(num / 10); } putchar(num % 10 + '0'); } int main() { const char *num_str = "1718944270642558716715"; __int128 num = str_to_int128(num_str); print_int128(num); // 输出:1718944270642558716715 putchar('\n'); return 0; }
编译时直接使用-std=gnu89参数即可,无需额外配置。
方案二:手动实现大整数结构(无扩展依赖)
如果你的数字可能超过__int128范围,或者不想依赖GNU扩展,可以用结构体+数组模拟大整数,逐位存储和转换:
#include <stdio.h> #include <string.h> #include <ctype.h> // 定义最大支持的位数,可按需调整 #define MAX_DIGITS 30 typedef struct { int digits[MAX_DIGITS]; // 低位在前存储数字 int length; // 有效数字长度 int is_negative; // 是否为负数 } BigInt; void str_to_bigint(const char *str, BigInt *num) { memset(num->digits, 0, sizeof(num->digits)); num->length = 0; num->is_negative = 0; // 跳过前置空白 while (isspace((unsigned char)*str)) { str++; } // 处理符号 if (*str == '-') { num->is_negative = 1; str++; } else if (*str == '+') { str++; } // 逆序存储数字(低位放数组开头) int str_len = strlen(str); num->length = str_len; for (int i = 0; i < str_len; i++) { if (!isdigit((unsigned char)str[str_len - 1 - i])) { // 遇到非法字符,清空结果 num->length = 0; return; } num->digits[i] = str[str_len - 1 - i] - '0'; } } void print_bigint(const BigInt *num) { if (num->is_negative && num->length > 0) { putchar('-'); } if (num->length == 0) { putchar('0'); return; } // 从高位到低位打印 for (int i = num->length - 1; i >= 0; i--) { putchar(num->digits[i] + '0'); } } int main() { const char *num_str = "1718944270642558716715"; BigInt num; str_to_bigint(num_str, &num); print_bigint(&num); // 输出:1718944270642558716715 putchar('\n'); return 0; }
这个方案完全基于C89标准,兼容-std=gnu89,且支持任意长度的数字(只需调整MAX_DIGITS的值)。
内容的提问来源于stack exchange,提问作者Enwerem Melvin
相关产品推荐
相关产品推荐

