繁体   English   中英

如何正确地将整数的实际参数发送到 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。

我想计算发送到 main 的整数的总和并返回总和。

#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 的转换无效,无法编译

我认为参数必须是指向 integer 的指针的 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 )已降级为指向指向 integer 的指针。

所以**temp应该是 integer。

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

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

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

#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打印为 integer,只有一个带有垃圾值。 您的所有代码都在假装您可以将整数发送到 main,但您不能,所以您会得到垃圾 output。

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

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

ac:参数计数 av:参数值

你只得到字符串作为参数,一个以 null 字节 '\0' 结尾的字符链。 此外,av 中的第一个值始终是程序名称本身。 尝试打印它;)

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

  • 标准::stoi
  • 标准::stof
  • 标准::标准
  • 标准::stol
  • 标准::斯托尔
  • 标准::斯托尔

它们都将字符串作为参数并返回解析后的数字。

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*指向一个 null 终止的 C 字符串。 这需要以某种方式转换为int 其他答案涵盖了杂项。 转换函数。 在这里,我将把每个 C 字符串放在std::istringstream中,并使用 C++ 格式的输入从 stream 中提取数据。

#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';
}

运行此程序时,您可以做一些“有趣”的事情,例如将两个int :s 放在一个参数中:

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

./program "1 2" 3

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM