繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM