如何正确地将整数的实际参数发送到 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 放在一个参数中:
将 1
和 2
放在一个参数中,将 3
放在另一个参数中:
./program "1 2" 3
输出:
3
1: 1 2
2: 3
The sum of all integered entered is 6
书上告诉我 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 放在一个参数中:
将 1
和 2
放在一个参数中,将 3
放在另一个参数中:
./program "1 2" 3
输出:
3
1: 1 2
2: 3
The sum of all integered entered is 6