scanf/sscanf能够处理转义字符吗?

4
int main()
{
  char* a = " 'Fools\' day' ";
  char* b[64];
  sscanf(a, " '%[^']s ", b);
  printf ("%s", b);
}

--> puts "Fools" in b

很明显,我想在 Fools' day 中。 我能告诉 sscanf ()不将转义的撇号视为字符序列的结尾吗?
谢谢!

3
\'' 是一样的。如果需要使用 '' 符号,你需要写成 \\' - kennytm
哇,这是一个很棒(而且快速)的社区。感谢提供答案! - u17
您可能还想查看boost :: format。www.boost.org/doc/libs/release/libs/format/doc/format.html - J. Polfer
3个回答

8

不可以。那些函数只读取普通的字符。它们不会按照任何转义规则解释内容,因为在输入字符串中没有特殊的引号、撇号和反斜杠需要进行转义。

您需要使用其他工具来解析您的字符串。您可以编写一个小型状态机逐个字符读取字符串,并记录先前的字符是否为反斜杠。(不要只是扫描到下一个撇号,然后向后查看一个字符; 如果您允许转义反斜杠和撇号,则可能会重新扫描整个字符串,以查看您是否有奇数或偶数个转义字符。始终向前解析字符串,而不是向后解析.)


0

替换

char* a = " 'Fools\' day' ";

使用

char* a = " 'Fools' day' ";

'字符在C字符串中并不特殊(尽管在单个char内是特殊的)。因此,没有必要对其进行转义。

另外,如果你只想要“愚人节”,为什么要在开头和结尾加上额外的'呢?也许你把C字符串和其他语言中的字符串混淆了?

编辑: 正如Rob Kennedy的评论所说,我假设您自己提供了字符串。否则,请参见Rob的答案。


1
我认为可以安全地假设sscanf的输入不会真正来自程序中的字符串字面量。相反,它将从其他地方读取(例如文件或键盘-因此也问及scanf),并且它将包含反斜杠,因为撇号对程序来说是特殊的。程序想要读取可能包含单引号的单引号字符串。 - Rob Kennedy
没错。抱歉,我会在下一个问题中尽量表达得更清楚 :) - u17

0

你到底为什么要这样写,而不是使用std::string呢?既然你的问题标记了C++。

int main(int argc, char* argv[])
{
    std::string a = " 'Fools' day' ";
    std::string b(a.begin() + 2, std::find(a.begin() + 2, a.end(), ' '));
    std::cout << b;
    std::cin.get();
}

编辑:等一下,你想在字符串中读取一个字符串吗?只需使用转义的双引号,例如:

int main(int argc, char* argv[]) {
    std::string a = " \"Fool's day\" ";
    auto it = std::find(a.begin(), a.end(), '"');
    std::string b(it, std::find(it, a.end(), '"');
    std::cout << b;
}

如果用户输入字符串,他们不需要转义单引号,但是他们需要转义双引号,并且您需要自己创建相应的系统。


所以将 +1 改为 +2。哎呀,那真难啊! - Puppy
嗯,不,只加1是没有帮助的。find调用会在第一个空格处停止,所以你将Fools'存储到了b中。天哪。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接