如何正确地将整数的实际参数发送到 main() 以计算 C++ 中的总和?

How can I correctly send actual parameters of integers to main() to calculate the sum in C++?

书上告诉我 main 的声明是这样的:

int main(int argc, char* argv[])

int main(int argc, char** argv)

似乎只有 int argc, char** argv 是我可以作为实际参数发送的东西。

现在我不想处理主要的字符串。

我想计算发送到 main 的整数之和 return 总和。

#include <iostream>
int main(int n, char** argv) {
        std::cout << n << std::endl;
        char** temp = argv;
        int sum = 0;
        int i = 0;
        while (*temp != NULL) {
                std::cout << i++ << ':' << *temp << std::endl;
                sum += *temp++;
        }

        return 0;
}

以上是我原先的思路,失效了

由于从 char 到 int 的转换无效,无法编译

我认为参数必须是指向整数的指针的 argc 数组。

下面是更新后的代码:

#include <iostream>

int main(int n, int* argv[]) {
        std::cout << n << std::endl; //print the number of the arguments passed
        int** temp = argv;
        int sum = 0;
        int i = 0;

        while (*temp != NULL) {
                std::cout << i++ << ':' << **temp << std::endl;
                if (*temp != argv[0])
                        sum += **temp;
                ++temp;
        }
        std::cout << "The sum of all integered entered is " << sum << std::endl;

        return 0;
}

用GCC编译代码后,输入./a.out 1 2 3,得到

4
0:778121006
1:3276849
2:3342386
3:1213399091
The sum of all integered entered is 1220018326

我知道它远非完美,但比第一个要好。

我认为temp(或argv)被降级为指向整数指针的指针。

所以**temp应该是一个整数。

为什么 **temp 的打印看起来像一个指针?

如何正确地将整数实参传给main计算和?

您不能将整数发送到 main。相反,您将发送到 main 的字符串转换为整数。您可以为此使用 std::stoi 函数

#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
     std::cout << argc << std::endl; //print the number of the arguments passed
     int sum = 0;
     for (int i = 1; i < argc; ++i)
         sum += std::stoi(argv[i]);
     std::cout << "The sum of all integered entered is " << sum << std::endl;
     return 0;
}

在您的代码中,**temp 打印为一个整数,只是一个具有垃圾值的整数。你所有的代码都在假装你可以将整数发送到 main,但你不能,所以你得到垃圾输出。

您不能更改主函数的签名,它无论如何都会保持不变。 正确的签名是:

int main(char ac, char **av); // or char *av[] if you prefer

ac : 参数计数 av : 参数值

您只获得字符串作为参数,即以空字节“\0”结尾的字符链。 此外,av 中的第一个值始终是程序名称本身。尝试打印出来 ;)

使用一个简单的函数,您可以将其转换为数字,有一个用于 int、float、double、long、unsigned long 和 unsigned long long。

  • std::stoi
  • std::stof
  • std::stod
  • std::stol
  • std::stoul
  • std::stoull

它们都以字符串作为参数,return 解析后的数字。

for (int i = 1 ; i < ac ; i++) { // we don't want the first value, so we start from 1
   int number = std::stoi(av[i]);
   std::cout << number << std::endl;
}

大多数直接方法都已涵盖,但我会提出另一种方法。

main 的第二个参数是 char* 的数组。每个 char* 指向一个空终止的 C 字符串。这需要以某种方式转换为 int 。其他答案涵盖了杂项。转换函数。在这里,我将把每个 C 字符串放在 std::istringstream 中,并使用 C++ 格式的输入从流中提取数据。

#include <iostream>
#include <sstream>

int main(int argc, char* argv[]) {
    std::cout << argc << std::endl; // print the number of the arguments passed

    int sum = 0;
    for(int i = 1; i < argc; ++i) {
        std::istringstream is(argv[i]); // put the argument in a istringstream
        std::cout << i << ':';

        int temp;
        // extract int:s from the stringstream until it's depleated
        while(is >> temp) {
            std::cout << ' ' << temp;
            sum += temp;
        }
        std::cout << '\n';
    }
    std::cout << "The sum of all integered entered is " << sum << '\n';
}

当 运行 这个时候,你可以做 "fun" 东西,比如把两个 int:s 放在一个参数中:

12 放在一个参数中,将 3 放在另一个参数中:

./program "1 2" 3

输出:

3
1: 1 2
2: 3
The sum of all integered entered is 6