gpt4 book ai didi

c - 使用 sscanf 读取字符串的剩余部分

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:27 24 4
gpt4 key购买 nike

我正在尝试读取一个字符串,该字符串由一组数字后跟一个字符串组成,并用其他一些基本文本包裹。

换句话说,行的格式是这样的:

Stuff<5,10,-5,8,"Test string here.">

我天真地尝试过:

sscanf(str,"Stuff<%d,%d,%d,%d,\"%s\">",&i1,&i2,&i3,&i4,str2);

但经过一些研究,我发现 %s 应该在遇到空白字符时停止解析。我找到了 this question ,但没有一个答案解决我遇到的问题:字符串中可以包含任何字符,包括换行符和正确转义的引号。后者不是问题,如果我能让 sscanf 将所有内容放在我提供的预分配缓冲区中的第一个引号之后,我就可以自己去掉结尾。

但是我该怎么做呢?我不能使用 %[] 因为它需要一些东西来终止字符串,而我唯一想终止它的是 null 终止符。所以我想,“嘿,我只使用空终止符!”但是 %[\0] 让编译器脾气暴躁:

warning: no closing ‘]’ for ‘%[’ format
warning: embedded ‘\0’ in format
warning: no closing ‘]’ for ‘%[’ format
warning: embedded ‘\0’ in format

使用 %*c 之类的东西也不会起作用,因为我不知道到底需要取多少个字符。我尝试传递 strlen(str) 因为它会小于那个值,但是 sscanf 返回 4 并且没有任何内容被放入 str2,这表明也许因为长度太长,它放弃了,没有打扰。

更新:我想我可以做类似的事情:

sscanf(str,"Stuff<%d,%d,%d,%d,\"%n",&i1,&i2,&i3,&i4,&n);
str2 = str+n;

最佳答案

您的更新似乎是一个很好的答案。我打算建议 strchr在使用 sscanf 之后找到第一个引号字符的位置得到i1通过 i4 .旁注,您应该始终检查 sscanf 的返回值以确保转换有效。这对于您建议的答案更为重要,因为 n如果前四次转换不成功,将保持未初始化状态。

关于c - 使用 sscanf 读取字符串的剩余部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com