sscanf:跳过任意数量的给定字符

时间:2013-10-14 19:06:52

标签: c scanf

在从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>

3 个答案:

答案 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将数字转换为二进制。