C++-将.at()方法与字符串一起使用时出现问题

C++ - Issue when using .at() method with string

本文关键字:问题 一起 字符串 at 方法 C++-      更新时间:2023-10-16

我试过在谷歌上搜索,并尝试了我能想到的一切,但我无法克服这个问题。所以我来到了StackOverflow的大师们!

我在使用.at((字符串方法时遇到问题:

std::string letters = "QWERTYUIO";
// &(letters.at(0)) now evaluates to QWERTYUIO
// &(letters.at(5)) now evaluates to YUIO
// etc.

我想要的是字符串的第n个字符,而不是从第n个开始的字符串。

我试过[]话务员,但现在有一个新问题。目前的代码是(使用Allegro库,但我不认为这会影响这一点(:

std::string letters = "QWERTYUIO";
char letter;
char StringY[5];
int row = 0;
for(int l = 0; l <= 2; ++l){
    letter = letters[row + l];
    textout_ex(buffer, font, &letter, l * 30, 20, makecol(255, 255, 255), -1);
    sprintf(StringY, "%d", inventoryNum[row + l + 9]);
    textout_ex(buffer, font, StringY, l * 30, 20, makecol(255, 255, 255), -1);
}

发生的情况是,letter变量似乎毫无明显原因地将上一次迭代的StringY附加到了自己身上。这简直把我逼疯了。

感谢您的帮助。

非常感谢,

威尔。

at()返回对字符串中指定字符的引用,因此当您将其地址与&一起使用时,您将获得指向该字符(类型为char *(的指针。

问题是,您将这个指针提供给某个对象,该对象需要指向chars的数组的指针。它也有类型char *,所以它的类型检查很好,但它被视为一个字符数组,而不是单个字符。

您可能只想放弃&并使用letters.at(5)


有些人建议改用operator[]。如果您编写&(letters[5]),它仍然会导致相同的问题。at()operator[]的区别在于前者进行边界检查,而后者不进行边界检查。

请参阅上的字符串:

将其用作:

(letters.at(0));
(letters.at(5));

使用operator[]

char c = letters[5];

编辑:您的问题是快板库。它有几十年的历史了,是用C写的。你真的需要本世纪的东西。例如,对于您的sprintf,我当然希望它不需要超过5个字符,而且您从未编写过0终止符或类似的东西。

你应该转向更现代的东西,比如Direct3D本身。D3DX有一个Font类,它可以透明地呈现文本,而无需用户手动将其写入纹理,并且您可以使用自己的C++字符串处理,而不是发布的代码中令人厌恶的处理。这至少是一个小的改进:

std::string letters = "QWERTYUIO";
std::stringstream strstream;    
for(int l = 0, row = 0; l <= 2; ++l){
    char letter;
    letter = letters[row + l];
    textout_ex(buffer, font, &letter, l * 30, 20, makecol(255, 255, 255), -1);
    strstream << inventoryNum[row + l + 9];
    textout_ex(buffer, font, strstream.str().c_str(), l * 30, 20, makecol(255, 255, 255), -1);
    strstream.clear();
}

只要说letters[5],或者你需要的任何位置。