1

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

编辑 2:我在C++ 参考中关于说明符的部分中读到“除了 %n,任何说明符都应使用至少一个字符。否则匹配失败,扫描到此结束。”

4

3 回答 3

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, " ,.-");
}

正如 Zack 所说,最好尽可能避免使用 sscanf 。

于 2013-10-14T20:05:10.020 回答
1

你必须使用*。* 表示丢弃读取的内容,不要将其存储在输出变量中。[...] 表示读取与括号之间的字符匹配的任何字符序列。这是一个例子:

sscanf(buf, "%*[;\n]%lf", &val);
于 2013-10-14T19:15:52.857 回答
0

您已经发现了为什么不应该使用的众多原因之一*scanf:让它处理真实文件格式的难度可笑。(其他重要原因包括编写看起来很正常但与 一样危险的构造是多么容易gets,以及数字溢出会导致未定义的行为这一事实。)

相反,使用strtok(或者,更好,strsep如果你有它)以分号分隔行缓冲区,然后strtod将数字转换为二进制。

于 2013-10-14T19:33:37.137 回答