使用sscanf时忽略存储在变量中的许多字符

时间:2019-11-19 20:27:04

标签: c scanf

在下面的代码中,我需要从格式为“ [double,double] string” 的行中提取双精度数和字符串,该字符串以第一个非白色字符开头,并且任意数量的白色 [

之后的字符

我确实关心正确加载数字,但不关心字符串(甚至可能为空)。

char *read;
size_t len=0;
double x,y;
int size;

getline(&read,&len,stdin);
char *name=(char*)malloc(strlen(read));
if(sscanf(read,"[ %lf, %lf ] %n",&x,&y,&size)!=2)
{
return 0;
} 
sscanf(read,"%*.c%[^\n]s",size,name);

我已经实现了一切。我知道第二个sscanf不能像这样工作,只能代表我的想法。有什么办法可以使size变量成为不加载多少个字符的参数?我搜索了所有内容,唯一能找到的就是定义了数字,这在这里无济于事。

我对编程还是很陌生,所以请对我有所了解,也许不了解基本知识。

2 个答案:

答案 0 :(得分:2)

如果我理解您的问题,并且您想分开,例如mutation{ meme( memeItems: [{ type: TEXT meta: "test1-meta" value: "test1-value" style: "test1-style" }, { type: TEXT meta: "test2-meta" value: "test2-value" style: "test2-style" }] ) { id, author { displayName } } } 进入两个双打,并使用"[123.456, 789.34] Daffy Duck"getline命名sscanf的存储空间,然后一次调用POSIX name,再一次调用{ {1}}将名称读入临时数组,然后分配并复制到getline(),将使您可以完全根据需要调整sscanf的大小。

例如:

name

无需强制返回name,这是不必要的。参见:Do I cast the result of malloc?

还要注意,当参数#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 1024 int main (void) { double x, y; char *read = NULL, *name = NULL, tmp[MAXN]; size_t n = 0; fputs ("input: ", stdout); if (getline (&read, &n, stdin) == -1) { fputs ("error: getline.\n", stderr); return 1; } if (sscanf (read, " [%lf ,%lf ] %1023[^\n]", &x, &y, tmp) == 3) { size_t len = strlen (tmp); if (!(name = malloc (len + 1))) { perror ("malloc-name"); return 1; } memcpy (name, tmp, len + 1); printf ("x : %f\ny : %f\nname: %s\n", x, y, name); free (name); } free (read); } 如上时,malloc将根据需要分配存储空间以处理您的输入行。因此,在调用n = 0之后,getline()已分配了存储时间。您将需要释放getline()以避免内存泄漏,并且不能简单地在read中返回指向read开头的指针,因为必须保留指向{{1}开头的指针},以便能够name

使用/输出示例

然后,通过在read format-string 中包含适当的空格,您可以灵活地读取输入内容,而无需考虑前导空格或中间空格,例如

read

输入中没有空格:

free

在输入中带有任意空格:

sscanf

仔细检查一下,如果还有其他问题,请告诉我。

答案 1 :(得分:0)

scanf可能会忽略与*格式化程序的匹配。有关转换规范here的更多信息。这样,您可以匹配并存储double并匹配并忽略以下字符串,即%*s

一种更简单的方法是使用]搜索strchr,然后仅将您真正感兴趣的字符串部分传递给sscanf(现在您知道它从哪里开始,结束)通过简单的指针算术。