对于声明采用char * output 参数的任何函数,有没有办法将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() );
或类似的东西?
谢谢!
答案 0 :(得分:2)
是的,这是可能的:
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'));
第二个条件很难满足,如果不满意,这个程序有不确定的行为。
答案 1 :(得分:1)
直到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。
答案 2 :(得分:0)
如果你想使用字符串,为什么不使用C ++方式的i / o呢?看看this link
答案 3 :(得分:0)
std::string replyStr(reply);
将创建一个char数组的字符串。
编辑:
但是...没有做任何不同的事情。
使用c ++样式输入/输出不必使用char*
。
cin >> replyStr;
将获得下一个字符串直到空格。
getline(cin,reply);
会将字符串设置为整行输入
答案 4 :(得分:0)
来自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.
如果你的字符串在函数内部,那么当函数返回时它将不存在。