[英]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。
它们都将字符串作为参数并返回解析后的数字。
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 放在一个参数中:
将1
和2
放在一个参数中,将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.