【问题标题】:Converting std::string with escape sequence to ascii values将带有转义序列的 std::string 转换为 ascii 值
【发布时间】:2016-01-03 20:21:21
【问题描述】:

我有一个 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

【问题讨论】:

  • 不清楚为什么需要它,但只需转义转义字符:'\\'
  • 我需要它以便与采用 ascii 值的外部函数集成。所以例如我需要提供 '\n' 的 ascii 值,这样这个函数才能正常工作。
  • 你为什么要标记一个 C++ 问题c
  • “问题是这段代码只是将“\n”视为两个单独的字符。”不,它没有。 -1 因为这个问题基本上是个大谎言:)
  • @LightnessRacesinOrbit 不是谎言。检查更新。

标签: c++ string flex-lexer


【解决方案1】:

问题在于这段代码只是将“\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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,我查过了,你似乎是对的。它确实适用于普通的 c++ 代码。但它似乎不适用于我的项目(yacc/bison 的 .y 文件)。我会更新我的问题。
    【解决方案3】:

    在您更改后的问题中,很明显您的输入字符串实际上包含两个单独的字符

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

    因此,您必须自己解决它们,通过扫描 '\\' 字符,然后(取决于下一个字符是什么),将其替换为所需的元字符。

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

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2011-08-24
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多