从字符串中获取单个字符串字符

Get single string char from a string

本文关键字:字符串 字符 单个 获取      更新时间:2023-10-16
for each (std::string s in m_intro.text) // std::vector<string>
    {
        for (int i = 0; i < s.length(); i++)
        {
            char* chr = &s.at(i);
            chr[i+1] = NULL;
            std::string t(chr);
            // other code is used below not shown as not relivent
        }
    }

我想从字符串中获取字符。我得到的每个字符我都想变成一个字符串(有一个函数需要const std::string&(

上面的代码工作一次,但在第一次循环之后,整个s都是空的。我明白为什么会发生这种情况。

我想要的是在每个循环中获取s的下一个字符并将其存储为字符串。

char* chr = &s.at(i);
chr[i+1] = NULL;
std::string t(chr);

char是 C 字符串(或 char 数组(的一部分时,您使用了正确的(如果过时(方法将下一个元素设置为 NULL 以终止字符串。

然而,在这种情况下,这无关紧要;你只是索引到一个std::string中,用NULL替换它的所有字符,这当然不是你的意思。

std::string有一个构造函数,您可以使用它来避免这种讨厌:

std::string t(1, s.at(i));
//   ^        ^    ^
//   |        |    |
// string     |    |
//            |    |
//     of length 1 |
//        char     |
//                 |
//     each having value s.at(i)

无需弄乱指针或char数组或NULL终止。

通过在循环中将''字符串分配给其元素来自己清除字符串。不应使用字符串的内部结构。相反,创建一个临时的单字符字符串,并在循环中重新分配其第一个字符,如下所示:

for each (std::string s in m_intro.text) // std::vector<string>
    {
        string tmp("_");
        for (int i = 0; i < s.length(); i++)
        {
            tmp[0] = s[i];
            // other code is used below not shown as not relivent
        }
    }
这是

为了做作业吗?为什么你认为"在第一次循环之后,整个s都是空的"?我看代码似乎很清楚,它表明您缺乏对字符串在 C/C++ 中如何工作的理解......

话虽如此,这里有一种可能的方法来实现您正在寻找的目标:

for each (std::string s in m_intro.text) // std::vector<string>
    {
        for (int i = 0; i < s.length(); i++)
        {
            std::string t = s.substring(i, 1);
            // other code is used below not shown as not relevant
        }
    }
char* chr = &s.at(i);

这是一个错误。编辑源字符串,使第二个元素 \0(以零结尾(截断它。试试这个代码:

        for (int i = 0; i < s.length(); i++)
        {
            char chrstr[2];
            chrstr[0] = s.at(i);
            chrstr[1] = NULL;
            std::string t(chrstr);
            // other code is used below not shown as not relivent
        }