【问题标题】:I need to make a C program that takes integers passed as command line arguments and print the sum我需要制作一个 C 程序,它将整数作为命令行参数传递并打印总和
【发布时间】:2019-09-20 21:36:28
【问题描述】:

我需要在单个文件“sum.c”中编写一个程序,该文件在命令行上接受多个整数,获取这些整数的总和并将它们打印到标准输出。程序必须使用 strtol 之类的东西从字符串转换为数字。

到目前为止,我的代码如下所示:

    #include <stdio.h>

int main (int argc, char *argv[]){
        int a, b, sum;
        int i; //looping through arguments using i

        if (argc<2) {
                printf("Please include at least two integers to get the sum.\n");
                return -1;
        }

a = atoi(argv[1]);
b = atoi(argv[2]);

sum=a+b;

printf(sum);
return (0);

}

这包括一个错误检查,以确保至少传递了两个参数。但是我当前的代码只允许两个参数。我需要弄清楚如何更改它以处理任意数量的参数,并检查传递的数字是否仅为整数而没有别的。我在此处发布的原始代码仍然存在编译错误。我从编码中休息了很长时间,所以我知道目前它很差。

更新代码:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
        int sum;
        sum = 0;

        if (argc<2) {
                printf("Please include at least two integers to get the 
sum.\n");
                exit (-1);
        }

        for (int counter = 1; argv[counter] != NULL; ++counter) {
                sum += atoi(argv[counter]);
        }

        printf("%d\n", sum);
exit (0);
}

现在看起来怎么样?

执行时收到错误:

./sum.c: line 4: syntax error near unexpected token `('
./sum.c: line 4: `int main (int argc, char *argv[]) {'

【问题讨论】:

  • 使用for 循环遍历所有参数。
  • printf(sum) 应该是printf("%d\n", sum);
  • 我根据您的建议更新了代码。现在看起来怎么样?
  • 你仍然需要在最后修复printf()。循环看起来不错,尽管您没有验证参数实际上是一个数字。
  • 哦,抱歉,我在我的代码中更新了它,但忘记在此处添加它。是的,我认为为了验证参数,我需要运行 if 语句来检查参数是否为整数?此外,当我运行此代码时,我收到第 4 行错误。

标签: c sum stdout stderr


【解决方案1】:

新代码基本上没问题,除了调用exit -1 的错误是一个错误。呼叫必须是exit(-1)

exit -1 没有产生编译错误的原因是 C 允许编译器接受无效的表达式作为合法(因此,以下是合法的 C 代码:

static void
useless_func (void)
{
    5;
    exit;
}

这个函数有两行什么都不做——值 5 和退出函数的地址。请注意,调用 useless_func() 将不会导致您的程序终止,因为退出函数本身没有被调用)。

你可以看到你自己在你的程序中,如果你不带参数调用,程序不会终止——0的总和将被打印出来。如果您将exit -1 行更改为exit 1,您将收到编译错误,因为现在您不再有合法的表达式(编译器将您所拥有的视为exit - 1 而不是exit -1,并且减号使其成为表达式)。

如果您使用 gcc 作为编译器,使用 -Wall 进行编译会产生警告。如果你用 -Wall -Werror 编译(一个非常好的习惯)你会得到一个错误。

另外,你应该通过调用exit(0);来结束你的程序

【讨论】:

  • 感谢您的回复并帮助我理解!更新退出代码后,我仍然遇到错误。如果你能帮我看看,我已经把它放回原帖了?
  • 新代码基本正确。您有一个小错误,因为您将接受一个整数并将其求和而不是拒绝它,并且至少需要两个(正如您所说的那样。接受 1(甚至 0)整数求和并不是本质上的错误。你只是没有按照你说的去做)。我不明白您关于在执行时出现语法错误的评论。那应该是不可能的——语法是在编译时评估的。您的意思是编译时出现语法错误吗?即使那样,我也没有看到任何语法错误。 (我的编译器也不接受这个代码)
【解决方案2】:

C 被编译,然后可以执行生成的可执行文件。你不运行 C 源代码

./sum.c

这会尝试运行 C 源代码。
你需要类似的东西

$ gcc -std=c99 -pedantic -Wall sum.c -osumexe
$ ./sumexe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2016-02-23
    • 2013-07-15
    • 1970-01-01
    • 2020-06-21
    • 2020-03-10
    • 2016-02-07
    相关资源
    最近更新 更多