【问题标题】:How can I correctly send actual parameters of integers to main() to calculate the sum in C++?如何正确地将整数的实际参数发送到 main() 以计算 C++ 中的总和?
【发布时间】:2020-08-29 16:25:51
【问题描述】:

书上告诉我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的转换无效,无法编译

我认为参数必须是指向整数的 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 以计算总和?

【问题讨论】:

  • 第一次尝试的结果是什么?
  • 你需要转换成int。见std::atoi
  • 您需要将main保留为int n, char** argv并将数组中的字符串转换为整数。
  • 只需循环 argc 将每个 argv[i] 转换为 int,然后添加。不需要temp ** 或类似的东西。问题似乎是你把 argc 值扔掉了,除了打印值之外不要使用它。
  • 您在命令行输入的文本就是:text。当文本需要表示数值时,您必须将文本转换为数字。

标签: c++ parameters arguments parameter-passing main


【解决方案1】:

您不能更改 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::stoll

都以字符串为参数,返回解析后的数字。

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

【讨论】:

    【解决方案2】:

    您不能将整数发送到 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,但您不能,所以您会得到垃圾输出。

    【讨论】:

    • 第二个参数应该是char*[]
    • @cigien 确实 - 我确定他只是在从 OP 复制时没有看到它,所以我修复了它。
    • 是的,我正要自己编辑它。感谢您加紧:)
    【解决方案3】:

    已经介绍了大多数直接方法,但我将提出另一种选择。

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

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

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

    ./program "1 2" 3
    

    输出:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多