在从char数组中读取之前,我想跳过任何分号或新行char。我写了这样的代码:
char[] buf;
// buf initialized
double val = 0.0;
sscanf(buf, "%[;\n]%lf", &val);
但是如果在buf的开头没有分号或换行符号,它将无法工作。如果这两个字符存在,我该如何更改该代码才能跳过这两个字符?
编辑:sscanf(buf, "%*[;\n]%lf", &val);
也不起作用。
测试样品buf值:“67.445906; 20.239875; 89.577929; 6.350902; 7.788324 \ n19.806513; 69.875179;”
edit2:我在关于说明符的部分C++ reference上读到“除了%n之外,任何说明符都应该使用至少一个字符。否则匹配失败,扫描结束。”< / p>
答案 0 :(得分:1)
您必须使用 * 。 *表示丢弃读取的内容,不要将其存储在输出变量中。 [...]表示读取与括号之间的字符匹配的任何字符序列。这是一个例子:
sscanf(buf, "%*[;\n]%lf", &val);
答案 1 :(得分:1)
假设您正在使用C语言编写,则可以尝试该解决方案。
double val = 0.0;
char buf[] = "67.445906;20.239875;89.577929;6.350902;7.788324\n19.806513;69.875179;";
char * ptr;
ptr = strtok(buf, ";\n");
while (ptr != NULL) {
// Here you iterate on different val, in this example we print them
printf ("%lf\n", &val);
ptr = strtok (NULL, " ,.-");
}
正如扎克所说,在可能的情况下最好避免使用sscanf。
答案 2 :(得分:0)
您已经发现了*scanf
永远不应该使用的众多原因之一:让它应对真实文件格式的荒谬难度。 (其他重要原因包括编写看起来理智但与gets
一样危险的构造是多么容易,以及数字溢出导致未定义行为的事实。)
相反,使用strtok
(或更好,strsep
,如果有的话)以分号分隔行缓冲区,然后strtod
将数字转换为二进制。