在cpp中使用stack <string>的stack.top()和stack.pop()的返回类型是什么?</string>

时间:2014-10-14 16:18:25

标签: c++ stl stack

我正在尝试使用堆栈的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”打印的。

4 个答案:

答案 0 :(得分:2)

std::stringchar*的版本不同,以下内容无效:

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;
}

Example

答案 1 :(得分:1)

返回值为popvoidtop返回对堆栈保存的数据类型的引用。 std::stringchar数组不同,并且它不直接与任何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 *。没有从stringchar *的类型转换。要转换它,请使用成员函数c_str

ch1 = cards.top().c_str();

ch1必须是const char*,而不是char *,因为那是c_str返回的内容。

为何返回const char*?因为否则你可以通过提取char *并更改它来破坏字符串值。