将带有转义序列的std :: string转换为ascii值

时间:2016-01-03 20:21:21

标签: c++ string flex-lexer

我有一个std :: string,我想迭代它,基本上变成一个int值流,表示每个字符的ascii值。

我的问题是转义字符。例如“\ n”。

std::string str = "hello\nhello";

for (char c : str) {
   int asciiVal = static_cast<int>(c);
   // now do something with val. but what about the escape sequence?
} 

问题是这段代码只将“\ n”视为两个单独的字符。

更新:

这是一个真正的问题。 是的,它不会发生在普通的c ++代码中,而是发生在包含C / C ++摘录的.lex文件中。 这是真正的代码和输出:

代码:.lex文件

char *c = yytext;
c[yyleng-1] = '\0';
c++;

std::string str = c;

cout << "MY STRING: '" << str << "'" << endl;

for (char c : str) {
    int val = static_cast<int>(c);
    std::cout << to_string(val) << std::endl;
}

输出:

MY STRING: '\n' 
92 
110

3 个答案:

答案 0 :(得分:3)

  

问题是这段代码只将“\ n”视为两个单独的字符。

     

任何帮助?

不,不。转义字符与常规字符一样存储 - 因此\n将被视为ab

http://www.cplusplus.com/doc/tutorial/ntcs/

您可以通过打印asciiVal进行验证。在您的情况下,输出是:

104  // h
101  // e
108  // l
108  // l
111  // o
10   // \n
104  // h
101  // e
108  // l
108  // l
111  // o

答案 1 :(得分:1)

不,"\n"将被视为单个char(0x0a)。如果您想要两个char使用"\\n"

答案 2 :(得分:1)

在你的修改过的问题中,很明显你的输入字符串确实包含两个单独的字符

(问题的原始版本不是这种情况。)

所以你必须自己解决它们,扫描一个'\\'字符,然后(取决于下一个字符是什么),用所需的元字符替换它。

更改您需要更改的任何设置以使输入字符串实际包含'\n'字符,而不是后跟'n'的反斜杠会更容易