You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义atoi()函数异常:乘法程序输出0而非预期值问题排查

问题分析与修复:自定义atoi导致两数相乘输出0

核心Bug点

  • 未初始化的flag变量:int flag;未赋初始值,程序运行时flag会是随机垃圾值,导致后续逻辑判断完全不可靠。
  • 错误的数字终止逻辑:在处理单个数字字符时,错误检查str[i+1]是否为数字,若遇到字符串末尾的'\0'(非数字),就将flag设为0并中断循环,最终返回0。这直接导致"2"、"3"这类合法单数字字符串被判定为无效输入,返回0,相乘结果自然为0。

修复后的代码

#include <stdio.h>

int myatoi(char* str)
{
    int i = 0, result = 0, sign = 1, flag = 0; // 初始化flag为0,标记是否处理过有效数字
    /** Check for whitespace */
    while (str[i] == ' ')
        i++;
    /** Check for sign of the first num */
    if (str[i] == '-')
    {
        sign = -1;
        i++;
    }
    for (; str[i] != '\0'; i++)
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            result = result * 10 + (str[i] - '0');
            flag = 1; // 标记已处理有效数字
        }
        else
        {
            break; // 遇到非数字字符,终止转换
        }
    }

    if (flag == 0)
        return 0; // 未处理任何有效数字,返回0
    return sign * result;
}

int main(int argc, char *argv[])
{
    int i, result = 1;

    if (argc < 3) // 两数相乘需至少传入2个数字参数,优化判断条件
    {
        printf("Error: Please input two numbers\n");
        return 1;
    }
    for (i = 1; i < argc; i++)
    {
        result = result * myatoi(argv[i]);
    }
    printf("%d\n", result);

    return 0;
}

修复细节说明

  1. 初始化flag:将flag初始化为0,仅当处理到有效数字时设为1,确保后续判断逻辑稳定可靠。
  2. 移除错误的str[i+1]判断:遵循atoi函数的常规逻辑——只要当前字符是数字就累加,遇到非数字字符直接终止循环,不再错误判定单数字字符串为无效输入。
  3. 优化参数检查:原代码判断argc < 2不符合两数相乘的需求,改为argc < 3并给出明确错误提示,避免用户传入不足参数时的模糊报错。

测试验证

运行./exe 2 3,myatoi("2")返回2,myatoi("3")返回3,相乘结果为6,符合预期。

内容的提问来源于stack exchange,提问作者Augusta Fidelix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:13:10