C初学者不终止程序

标签 c sum termination

我是 C 初学者,我收到了编写一个简单的求和程序的任务,其中我必须使用我自己的 atoi 函数。

这种行为真的很奇怪:
sum 1 -> 工作正常,它写着“总和为 1”
sum 1 2 -> 它不会终止
sum -1 -2 -> 它只写入第一个数字,如果我使用超过 2 个数字,它不会终止

这是代码的一些部分,我认为错误在mi_atoi中,因为如果我使用库函数它可以正常工作:

unsigned int char2int(char c)
{
    return c-'0';
}

int mi_atoi(char *s)
{
    int x = 0;
    if (s[0] == 45) {
        for (i = 1; s[i] != '\0'; i++) {
            x = x*10 - char2int(s[i]);
        }
    }
    else { 
        for (i = 0; s[i] != '\0'; i++) {
            x = x*10 + char2int(s[i]);
        }
    }

    return x;
}

这里是 main(函数 esNumero 只是检查参数是否是数字并且工作正常):

int main (int argc, char *argv[])
{
    char buf[80];
    int suma = 0;

    for (i = 1; i < argc; i++) {
        if (esNumero (argv[i]) == 0) {
            sprintf (buf, "El parametro \"%s\" no es un numero\n", argv[i]);
            write (1, buf, strlen (buf));
            return 0;
        }
        else {
            suma = suma + mi_atoi(argv[i]);
        }
    }
    sprintf (buf, "La suma es %d\n", suma);
    write (1, buf, strlen (buf));

    return 0;
}

您能看一下我的代码并告诉我我做错了什么吗?

最佳答案

您的i是一个全局变量,因此在mainmi_atoi之间共享。每次调用 mi_atoi 时,它都会重置 i,因此 main 中的循环永远不会终止。

您巧妙地尝试通过不发布 i 的声明(更不用说 Minimal, Complete, and Verifiable Example )来隐藏错误,但我们可以看到 i 没有声明为您发布的函数中的局部变量。

关于C初学者不终止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549114/

相关文章:

prolog - 如何为所有参数模式实现列表项删除?

c++ - 使用 Opencv 绘制彩色图像的直方图

c - 为什么将节点放入此队列的顶部会出现段错误?

php - 选择 SUM() 作为 for 循环中的变量

mysql - "sum"产品重量如果产品在不同行怎么办?

linux - 主机进程终止时的 CUDA 上下文销毁

.net - 为什么我的程序不会终止?

c++ - fmod 还是不 fmod?

c++ - Windows 上的进程资源限制

c# - Linq 按日期分组(月)