字符串输出给出奇怪的字母

时间:2013-11-21 23:36:39

标签: c++ string

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    string s = "Too many tags";
    for(int i = 0; i < s.size(); i++){
        if(!(isspace(s[i]))){
            s[i] = '#' + s[i];
        }
    }
    cout << s << endl;
    return 0;
}

我正在尝试制作一个程序,在字符串中的每个字母之前添加#tag,但在输出中我得到奇怪的字母..我的错误在哪里?

3 个答案:

答案 0 :(得分:6)

s[i] = '#' + s[i];

修改现有字符的值。如果要在字符串中添加新字符,则应使用insert

s.insert(i, "#");

正如Mark Ransom指出的那样,你还需要在字符串中再移动一个字符,以避免在同一个字母前不断添加“#”。您可以使用

执行此操作
s.insert(i++, "#");

请注意,您可以随时接受VladimirM的建议,并对

之类的内容进行稍微更大的更改
int i=0;
while (i<s.size()) {
    if (!isspace(s[i])) {
        s.insert(i++, "#");
    }
    i++;
}

答案 1 :(得分:4)

这一行:

s[i] = '#' + s[i];

没有做你想象的那样。 s[i]char#也是char。将这些添加在一起并不会给出两个字符的串联,它会为您添加字符的整数代码(因此#为35,而s[i]恰好是{{1}}的ASCII代码)。

答案 2 :(得分:2)

我添加更多:我认为更简单的方法是使用临时变量,否则你的'insert'循环将进入无限循环并将​​挂起:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    string s = "Too many tags";
    string res = "";
    for(int i = 0; i < s.size(); i++){
        if(!(isspace(s[i]))){
            res += "#";
        }
        res += s[i];
    }
    cout << res << endl;
    return 0;
}