gpt4 book ai didi

C++ 字符串变成指针

转载 作者:太空宇宙 更新时间:2023-11-04 16:31:10 26 4
gpt4 key购买 nike

我有一个声明如下的函数:

void playCard(string card);

和以下实现:

void Player::playCard(string card)
{
cout << "Playing " << card << "!" << endl;

// Find iterator representing the card to be played
vector<Card*>::iterator iter;
for(iter = hand.begin(); iter != hand.end(); iter++)
{
if( (*iter)->getName() == card)
continue;
}

// ERROR - Card not found in hand
if(iter == hand.end())
assert(false);

// more stuff
}

该函数从以下代码块中调用:

// Divide string into 2 words
istringstream iss(in, istringstream::in);
string command, target;
iss >> command >> target;

if(command == "play")
{
players.at(currentTurn)->playCard(target);
}

玩家声明为:

vector<Player*> players;

我遇到的问题是,无论“card”字符串是什么,我都会遇到 card not found 断言。根据 gdb:

Breakpoint 1, Player::playCard (this=0xb3a010, card=0x28ca00) at Player.cpp:138
138 cout << "Playing " << card << "!" << endl;
(gdb) print card
$1 = (string *) 0x28ca00

所以在 playCard() 函数中,出于某种原因,卡片变量是一个指针。有趣的是,cout 语句仍然正确显示字符串的内容。在调用 playCard() 之前,根据 gdb,该变量不是指针,只是一个普通字符串。

此外,这很有趣:

(gdb) print iter
$1 = {_M_current = 0xb9a328}
(gdb) print iter->getName()
Couldn't find method __normal_iterator<Card**,std::vector<Card*, std::allocator<Card*> > >::getName
(gdb) print *iter
$2 = (class Card *&) @0xb9a328: 0xb9a160
(gdb) print *iter->getName()
Couldn't find method __normal_iterator<Card**,std::vector<Card*, std::allocator<Card*> > >::getName
(gdb) print (*iter)->getName()

Program received signal SIGSEGV, Segmentation fault.
0x61111178 in memcpy () from /usr/bin/cygwin1.dll

因此,当我尝试打印最后一个时,gdb 会导致段错误,但执行相同的代码时不会出现任何段错误。

我有一种感觉,我正在处理一些奇怪的内存问题,这些问题与拥有一个充满对象指针的 vector 有关,但我不能完全确定它。

这是怎么回事?

最佳答案

您希望在循环内使用 break 而不是 continue

它们有点相似; continue表示继续循环的下一次迭代,break表示跳出循环。

关于C++ 字符串变成指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com