我的Windows机器上正在创建program.exe
。由于某种原因,我无法正确传递命令行参数。
int main(int argc, char *argv[]) {
///////testing
cout << "\n\n(int)ARGV[1]: " << (int)argv[1] << "\n\n";
return 0;
}
在终端我跑:
program.exe 4
我看到(int)ARGV[1]: 15333464
打印到我的控制台。
知道为什么会这样或者我如何修改代码?我应该打印出4号。感谢。
答案 0 :(得分:5)
当您从char*
转换为int
时,您会将指针值bitpattern解释为整数。
一种很好的方法来解释指向的字符串,作为整数的规范,是使用std::stoi
标题中的<string>
。
因此:
#include <iostream>
#include <stdlib.h> // EXIT_FAILURE
#include <string> // std::stoi
using namespace std;
int main(int argc, char *argv[])
{
if( argc != 2 )
{
return EXIT_FAILURE;
}
cout << "ARGV[1]: " << stoi( argv[1] ) << "\n";
}
对于参数不是整数的有效规范的情况,stoi
将抛出异常,并且在上面的代码中将导致程序终止并显示一些消息 - 崩溃。这通常比产生不正确的结果更可取。但是如果你想处理它,请在C ++教科书中阅读try
和catch
。
如果您希望 filenames 作为命令行参数,更常见的是文件系统路径,那么请注意,基于char
的字符串编码的Windows约定是Windows ANSI,它有一个非常有限的一组字符。我的挪威计算机上的某些文件名和路径无法在您的Windows ANSI中表示(是的,Windows ANSI是特定于语言环境的)。所以对于这个,C和C ++ main
参数机制是不合适的。
Windows API提供了一对基于wchar_t
的函数,可用作(工作)替代函数,即GetCommandLine
(检索原始UTF-16编码的命令行)和{{1 (标准解析以生成单个参数)。
某些Windows编译器还提供标准CommandLineToArgvW
的替代方案main
,其中wmain
声明为argv
。这些编译器包括Visual C ++和g ++的MinGW64变体。
答案 1 :(得分:0)
此处argv[1]
是一个字符指针(char*
),因此您无法通过类型转换将字符指针转换为整数。因此,要将字符指针转换为整数,请使用atoi()
函数,该函数可在c标准库中找到(包括cstdlib
库)。
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::atoi;
int main(int argc, char *argv[])
{
cout << atoi(argv[1]) << " " << endl;
return 0;
}
请注意,如果传递给它的参数不能转换为整数,则atoi()
返回零。因此,您可以检查返回的值,如果它为零,则打印相关消息。
因此:
#include <iostream>
#include <cstdlib>
#include <cstring>
using std::atoi;
using std::cout;
using std::endl;
using std::strcmp;
int main(int argc, char *argv[])
{
if(argc == 2)
{
if(atoi(argv[1]) == 0 && strcmp(argv[1], "0") != 0)
cout << "The argument supplied is not an integer" << endl;
else
cout << atoi(argv[1]) << " " << endl;
}
else if( argc > 2)
cout << "Too many arguements" << endl;
else
cout << "Insufficient arguements" << endl;
return 0;
}