我是 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
是一个全局变量,因此在main
和mi_atoi
之间共享。每次调用 mi_atoi
时,它都会重置 i
,因此 main
中的循环永远不会终止。
您巧妙地尝试通过不发布 i
的声明(更不用说 Minimal, Complete, and Verifiable Example )来隐藏错误,但我们可以看到 i
没有声明为您发布的函数中的局部变量。
关于C初学者不终止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549114/