0

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

或类似的东西?

谢谢!

4

5 回答 5

2

Yes this is possible:

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'));

The second condition is very difficult to satisfy, and if it is not satisfied this program has undefined behaviour.

于 2012-04-25T23:35:28.350 回答
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。

于 2012-04-25T23:45:54.343 回答
0

如果你想使用字符串,为什么不使用 C++ 的 i/o 方式呢?看看这个链接

于 2012-04-25T23:28:17.680 回答
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.

如果您的字符串在函数内部,则函数返回时它将不存在。

于 2012-04-25T23:46:58.920 回答
0

std::string replyStr(reply);将制作您的 char 数组的字符串。

编辑:

但是......这并没有什么不同。

使用 c++ 样式输入/输出不必使用char*.

cin >> replyStr;将获得下一个字符串,直到空格。 getline(cin,reply);将字符串设置为整行输入

于 2012-04-25T23:28:25.007 回答