sscanf:跳过任意数量的给定字符
在读取字符数组之前,我想跳过任何分号或新行字符。我编写了如下代码:sscanf:跳过任意数量的给定字符,c,scanf,C,Scanf,在读取字符数组之前,我想跳过任何分号或新行字符。我编写了如下代码: 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.5779
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:我在关于说明符的一节中读到,“除%n外,任何说明符都应至少使用一个字符。否则匹配失败,扫描到此结束。”您必须使用*。*表示丢弃读取的内容,不要将其存储在输出变量中。[…]表示读取与括号之间的字符匹配的任何字符序列。以下是一个例子:
sscanf(buf, "%*[;\n]%lf", &val);
您已经发现了不应该使用*scanf
的众多原因之一:让它处理真实文件格式的荒谬困难。(其他重要原因包括编写看起来正常但与得到的一样危险的结构是多么容易,以及数字溢出导致未定义行为的事实。)
相反,可以使用strtok
(或者更好的方法是使用strep
,如果有的话)以分号分隔行缓冲区,然后使用strtod
将数字转换为二进制。假设您是用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。就是这样,在检查结果时希望添加,*
不会对结果产生影响,因此1
应该在“%*[;\n]%lf”
中出现。它不起作用sscanf
返回0
和val
保留0.0
。您希望从中得到什么输出?我知道可能有一些misunderstandment@RuggeroGalloni我希望sscanf
返回1,val
将包含67.445906
(来自给定示例)