在下面的代码中,我需要从格式为“ [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变量成为不加载多少个字符的参数?我搜索了所有内容,唯一能找到的就是定义了数字,这在这里无济于事。
我对编程还是很陌生,所以请对我有所了解,也许不了解基本知识。
答案 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
(现在您知道它从哪里开始,结束)通过简单的指针算术。