题目

从包含杂乱文本的字符串中,提取出其中的第一个有效十进制整数并输出(实现简易版的 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