Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sscanf:跳过任意数量的给定字符_C_Scanf - Fatal编程技术网

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
(来自给定示例)