C++ sscanf用于此类型的字符串

C++ sscanf用于此类型的字符串,c++,parsing,scanf,C++,Parsing,Scanf,即使在阅读了文档之后,我也不太确定如何使用sscanf实现这一点 以下是我想做的: 给定一个文本字符串: 最多读取前64个字符或直到达到空格 然后会有一个空格,然后是另一个空格。 接下来,我想提取另一个字符串,直到字符串结束,或者如果达到8192个字符。我还希望它将第二个字符串“\n”中出现的任何内容更改为实际的换行符 我有:“%64s=%8192s”,但我认为这不正确 谢谢 例: element.name=hello\n世界 将字符串1的element.name和string2作为 hello

即使在阅读了文档之后,我也不太确定如何使用sscanf实现这一点

以下是我想做的: 给定一个文本字符串:

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

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

谢谢

例:

element.name=hello\n世界

将字符串1的element.name和string2作为

hello
world

为此,我推荐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;
}
#包括
int main(int argc,const char*argv[]
{
chars1[65];
chars2[8193];
如果(2!=std::scanf(“%64s=%8192s”,s1,s2))
看跌期权(“oops”);
其他的
std::printf(“s1='%s',s2='%s'\n',s1,s2”);
返回0;
}

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


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

有几个不一致之处:“要么直到字符串结束”==“要么直到行结束”?“实际换行符”?目前,此任务无法通过
sscanf
解决,因为它不区分空格和换行符。sscanf很少是任何输入验证问题的答案。将行读入字符串,并使用普通字符串manip或正则表达式验证数据。
%8192s
将在第一个空格处停止,这可能不是所需的结果。您可能可以避开
%8192[^\n]
(但最多有8kib的非换行字符。我假设“到字符串结尾”意味着“到行结尾”。将字符反斜杠-n转换为换行将是一个单独的操作。