【问题标题】:sscanf for this type of stringsscanf 用于这种类型的字符串
【发布时间】:2011-12-31 01:56:17
【问题描述】:

即使在阅读了如何使用 sscanf 执行此操作的文档之后,我也不太确定。

这是我想做的: 给定一串文本:

最多读取前 64 个字符或直到达到空间 然后会有一个空格,一个=,然后是另一个空格。 之后,我想提取另一个字符串,直到字符串结束或达到 8192 个字符。我还希望它将“\n”的第二个字符串中的任何出现更改为实际的换行符。

我有:“%64s = %8192s”,但我认为这是不正确的。

谢谢

例如:

element.name = hello\nworld

字符串 1 与 element.name 和 string2 为

hello
world

【问题讨论】:

  • 有几个不清楚的地方:“要么直到字符串的结尾” == “要么直到行尾”? “实际换行符”??
  • 目前,sscanf 无法解决此任务,因为它不区分空格和换行符。
  • sscanf 很少能解决任何输入验证问题。将行读入字符串并使用普通字符串 manip 或正则表达式来验证数据。

标签: c++ parsing scanf


【解决方案1】:

我确实为此推荐 std::regex,但除此之外,您应该可以进行一些错误检查:

#include <cstdio>

int main(int argc, const char *argv[])
{
    char s1[65];
    char s2[8193];
    if (2!=std::scanf("%64s = %8192s", s1, s2))
        puts("oops");
    else
        std::printf("s1 = '%s', s2 = '%s'\n", s1, s2);
    return 0;
}

【讨论】:

  • %8192s 将停在第一个空白处,这可能不是所需的结果。您可能能够摆脱%8192[^\n](不过,最多 8 KiB 的非换行符。我假设“到字符串结尾”的意思是“到行尾”。将字符反斜杠-n 转换为换行符将是一个单独的操作。
【解决方案2】:

您的格式字符串对我来说很合适;但是,sscanf 不会将“\n”的出现更改为其他任何内容。为此,您需要编写一个使用 strtok 的循环,甚至只是一个简单的 for 循环,评估字符串中的每个字符并将其交换为您喜欢的任何字符。您还需要评估 sscanf 返回值以确定这 2 个字符串是否确实被正确扫描。 sscanf 根据您的格式字符串返回成功扫描的字段数。

@sehe 显示了 sscanf 的正确用法,包括检查正确的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2010-11-07
    • 2023-03-04
    • 1970-01-01
    • 2015-08-23
    • 2014-06-12
    • 2012-10-13
    相关资源
    最近更新 更多