scanf / sscanf可以处理转义字符吗?

时间:2010-07-07 12:16:06

标签: c++ c

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

--> puts "Fools" in b

显然,我希望 b 中有“傻瓜日”。我可以告诉 sscanf ()不要将转义撇号视为字符序列的结尾吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

没有。这些功能只是阅读普通的旧字符。它们不会根据任何转义规则解释内容,因为没有什么可以逃脱 - 引号,撇号和反斜杠在输入字符串中并不特殊。

你必须使用别的东西来解析你的字符串。您可以编写一个小状态机来一次读取一个字符串,跟踪前一个字符是否为反斜杠。 (不要只是扫描到下一个撇号,然后向后看一个字符;如果你被允许逃避反斜杠和撇号,那么你最终可能会重新扫描一直回到字符串的开头看是否有奇数甚至转义字符数。始终向前解析字符串,而不是向后解析字符串。)

答案 1 :(得分:0)

替换

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

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

{C}字符串中的'字符并不特殊(尽管它在单个char内是特殊的)。所以没有必要逃避它。

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

编辑: 正如Rob Kennedy的评论所说,我假设你自己提供弦乐。否则,请参阅Rob的回答。

答案 2 :(得分: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;
}

如果用户输入字符串,他们就不必转义单引号,尽管他们必须转义双引号,并且你必须为此制作自己的系统。