在Linux系统下用命令行参数调用main()函数,如果以string[ ]为参数值:
#include <iostream>
#include <cstdlib>
#include <cstring>
using std::cout;
using std::endl;
using std::string;
int main(int argc, string argv[])
{
if (argc != 2)
{
cout << "Usage: ./echo_client message" << endl;
exit(1);
}
cout << "message: " << argv[1] << endl;
return 0;
}
输出结果会额外打印了一些其他信息(疑似字符串结尾的‘\0’出问题了???):
然而,如果改成以char* argv[ ]为参数值并将其转化为string对象再输出:
#include <iostream>
#include <cstdlib>
#include <cstring>
using std::cout;
using std::endl;
using std::string;
int main(int argc, char* argv[])
{
if (argc != 2)
{
cout << "Usage: ./echo_client message" << endl;
exit(1);
}
string message = argv[1];
cout << "message: " << message << endl;
return 0;
}
或者是以string[ ]为参数值并用c_str()方法将其转换为const char*类型再输出:
#include <iostream>
#include <cstdlib>
#include <cstring>
using std::cout;
using std::endl;
using std::string;
int main(int argc, string argv[])
{
if (argc != 2)
{
cout << "Usage: ./echo_client message" << endl;
exit(1);
}
const char* message = argv[1].c_str();
cout << "message: " << message << endl;
return 0;
}
都能够得到正确的输出结果:
用printf()代替cout打印const char*的字符串也能得到正确结果。
个人猜测是直接将命令行输入的参数作为string数组类型输入可能存在终止符丢失的情况,而将其转化为char*类型或是直接用char*[ ]作为输入参数则能够避免这一问题,具体原因暂时不得而知。