如何使用std :: string作为char *输出参数

时间:2012-04-25 23:22:10

标签: c++ parameters stdstring

对于声明采用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() );

或类似的东西?

谢谢!

5 个答案:

答案 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.

如果你的字符串在函数内部,那么当函数返回时它将不存在。