题目
从包含杂乱文本的字符串中,提取出其中的第一个有效十进制整数并输出(实现简易版的 atoi)。若未包含数字输出 0。
输入格式:输入一行可能包含前导空白、符号、字母与数字的混合字符串。
输出格式:输出提取出的带符号整数,末尾换行。
数据范围与约定:字符串长度不超过 200,数值在标准 32 位 int 范围内。
思路与算法
1. 跳过前导空白
指针遍历跳过空格、制表符等字符:while (isspace(*p)) p++;。
2. 正负号判断与累乘
检查是否存在 + 或 - 符号,记录符号位 sign 并前进一位。随后循环读取连续数字:val = val * 10 + (*p - '0');,遇到非数字字符即刻停止解析。
完整程序
#include <stdio.h>
#include <ctype.h>
// 经典 atoi 字符串转整数实现
static int simple_atoi(const char *s)
{
// 1. 跳过前导空白字符
while (isspace((unsigned char)*s)) {
s++;
}
// 2. 解析正负符号
int sign = 1;
if (*s == '-') {
sign = -1;
s++;
} else if (*s == '+') {
s++;
}
// 3. 逐位转换数字:当前值 * 10 + 新数字('0'~'9' 减去 '0' 得到数值)
int val = 0;
while (isdigit((unsigned char)*s)) {
val = val * 10 + (*s - '0');
s++;
}
return sign * val;
}
int main(void)
{
char line[200];
if (!fgets(line, sizeof line, stdin)) {
return 1;
}
printf("%d\n", simple_atoi(line));
return 0;
}运行示例
输入:
-42abc输出:
-42