为什么我不能用“\ x”初始化字符串

时间:2012-10-29 12:02:01

标签: c++ string

为什么我无法使用“\ x”

初始化字符串
string s = "\x"

如果我以后写的话会很有用:

int grade = 0;
while (cin >> grade)
    if (grade < 60)
        cout << "Your grade letter is F!";
    else {
        x = 50 - grade/10;
        s = s + static_cast<string>(x);
        cout << "Your grade letter is " << s << endl; 
    }

我更喜欢使用转义序列计算来设置成绩字母的答案。

2 个答案:

答案 0 :(得分:4)

因为语法禁止它。字符串文字中的\x序列是一个前缀,表示“此处是字符的十六进制代码”,但您尝试省略代码部分。这意味着无法解析文字并找出要放入字符串的字符。

请注意,这是编译时的事情,只需查看文字本身,就必须能够计算字符串文字所代表的字符序列。

答案 1 :(得分:2)

您误解了转义序列的处理方式。它们是在编译时计算的,而不是在运行时计算的。换句话说,当你写

"\x48"

它在运行时不会成为包含四个字符的字符串;编译器在程序运行之前将其转换为单字符字符串。

您也误解了static_cast<...>:如果x 而不是std::string,则将其静态转换为字符串会导致错误;如果它是std::string,则静态转换将不起作用。

您可以在运行时创建单字符字符串,并将字符代码放入其唯一的字符中,如下所示:

int grade = 83; // <<<=== 1..100
grade--;
int gradeLetter = g < 60 ? 'F' : ('A' + (100-grade)/10);
// At this point you can do the output:
cout << "Your grade is " << gradeLetter << endl;
// If you must have a string, do this:
string gradeStr(1,gradeLetter);
cout << "Your grade is " << gradeStr << endl;