我正在尝试使用堆栈的printf()打印stack.top()的返回值,但它给出的格式不匹配。代码如下:
int main(){
stack <string> cards;
char *ch1;
char ch2[20];
cards.push("Ace");
cards.push("King");
cards.push("Queen");
cards.push("Jack");
printf("Number of cards : %ld \n", cards.size());
ch1 = cards.top(); // As sizeof(cards.top()) is 8. error of type conversion
strcpy(ch2,cards.top()); // cannot convert ‘std::basic_string<char>’ to ‘const char*’
printf("Top of the Stack : %s \n", ch);
return 0
}
在所有例子中,我看到它是用“cout”打印的。
答案 0 :(得分:2)
std::string与char*
的版本不同,以下内容无效:
ch1 = cards.top(); // top() returns a string, not a char*
我建议您使用std::string
代码:
int main(){
stack <string> cards;
string ch1; // std::strings
string ch2;
...
ch1 = cards.top(); // Correct
printf("Top of the Stack : %s \n", ch1.c_str()); // c_str() needed
return 0;
}
另请注意,使用printf
需要char*
类型,您可以使用std::string::c_str()
获得一个,或者(甚至更好)您可以首先使用cout
:
std::cout << "Top of the Stack : " << ch1;
因此,我建议做类似的事情:
#include <iostream>
#include <stack>
#include <string>
int main() {
std::stack <std::string> cards;
std::string ch1;
cards.push("Ace");
cards.push("King");
cards.push("Queen");
cards.push("Jack in the Jack");
std::cout << "Number of cards : " << cards.size() << std::endl;
ch1 = cards.top(); // Get the top card
std::cout << "Top of the Stack : " << ch1;
}
答案 1 :(得分:1)
返回值为pop
为void
,top
返回对堆栈保存的数据类型的引用。 std::string
与char
数组不同,并且它不直接与任何C字符串函数一起使用。您可以使用std::string::c_str()
来获取原始数据,但最好留在STL土地上。您可以使用std::string
直接打印std::cout
。
答案 2 :(得分:0)
对于C ++ strcpy
,你不能使用char *
,这是C风格std::string
字符串的C函数 - 如果由于某种原因必须使用C字符串然后更改:
strcpy(ch2,cards.top());
到
strcpy(ch2,cards.top().c_str());
^^^^^^^^
这会使std::string
返回cards.top()
并返回const char *
,strcpy
可以使用std::string
。
更好的解决方案是坚持使用C ++习语,即仅使用std::cout
并使用printf
代替{{1}}进行显示。
答案 3 :(得分:0)
在以下一行
ch1 = cards.top();
stack<string>::top()
返回string
,而ch1是char *
。没有从string
到char *
的类型转换。要转换它,请使用成员函数c_str
:
ch1 = cards.top().c_str();
ch1必须是const char*
,而不是char *
,因为那是c_str
返回的内容。
为何返回const char*
?因为否则你可以通过提取char *
并更改它来破坏字符串值。