Linux系统下用命令行参数传递C++ string类字符串时可能出现的问题

在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*[ ]作为输入参数则能够避免这一问题,具体原因暂时不得而知。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值