[英]How to use a std::string for a char* output parameter
对于声明为采用char * 输出参数的任何函数,是否可以将s std :: string的“ char”部分指定为函数的输出?
我从开始:
// EDIT: ADDED THESE TWO LINES FOR CLARITY
sprintf(buf, "top -n 1 -p %s" , commaSeparatedListOfPIDs.c_str() );
fp = popen(buf, "r");
std::string replyStr;
char reply[100];
rc = scanf( fp, "%s", reply );
replyStr = reply;
但这看起来有点笨拙。
所以,有没有办法说:
rc = scanf( fp, "%s", &replyStr.c_str() );
或类似的东西?
谢谢!
是的,这是可能的:
std::string replyStr(100, '\0');
//Requires C++11 (to guarantee that strings hold their characters
//in contiguous memory), and some way to ensure that the string in the file
//is less than 100 characters long.
rc = fscanf( fp, "%s", &reply.front() );
replyStr.erase(replyStr.find('\0'));
第二个条件很难满足,如果不满足,该程序将具有不确定的行为。
直到c ++ 0x,&str [0]才不需要返回指向连续存储的指针。 常规方法是使用std :: vector,即使在c ++ 0x之前,也可以保证具有连续存储:
std::vector<char> reply(100);
rc = scanf(fp, "%s", &reply[0]);
但是,在c ++ 0x中,也可以保证std :: string代替std :: vector工作。
如果要使用字符串,为什么不也使用C ++的I / O方式呢? 看看这个链接
std::string replyStr(reply);
将为您的char数组的字符串。
编辑:
但是...没有什么不同。
使用输入/输出的c ++样式不必使用char*
。
cin >> replyStr;
将获得下一个字符串,直到空格。 getline(cin,reply);
将字符串设置为整行输入
来自std :: String的char *仅在字符串有效时才有效。 如果std :: String超出范围,则它不再是有效的char指针。
const char* bar;
{
std::String foo = "Hello";
bar = foo.c_str();
printf("%s", bar); //SAFE since the String foo is still in scope
}
printf("%s", bar); //UNSAFE String foo is no longer in scope
只要存在std :: String变量,就可以使用const char *(如果超出范围),则释放内存,并且const char *指针变为不再安全使用的悬空指针。
如果您需要在std :: String foo超出范围后才存在,则必须将字符串复制到char *中。
char bar[100];
{
std::String foo = "Hello";
strncpy(bar, foo.c_str(), 100);
bar[100] = '\0'; //make sure string is null-terminated
printf("%s", bar); //SAFE
}
printf("%s", bar); //SAFE even though the std::String has gone out of scope.
如果您的字符串在函数内部,则该函数返回时将不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.