- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在将一些 HTTP 处理构建到 C 程序(在 Linux 上使用 glibc 编译)中,该程序将位于 nginx 实例后面,并认为我应该安全地将参数标记化推迟到 sscanf
在这种情况下。
我很高兴地发现从 URI 中提取查询非常简单:
char *path = "/events?a=1&b=2&c=3";
char query[64] = {0};
sscanf(path, "%*[^?]?%64s HTTP", query); // query = "a=1&b=2&c=3"
但令我惊讶的是,事情变得如此迅速
int pos = -1;
char arg[32] = {0}, value[32] = {0};
int c = sscanf(query, "%32[^=]=%32[^&]&%n", &arg, &value, &pos);
对于
a=1&b=2
的输入, 我得到
arg="a"
,
value="1"
,
c=2
,
pos=4
.完美:我现在可以在
path + pos
上重新运行 sscanf得到下一个论点。为什么我在这里?
a=1&
行为与上述相同,
a=1
生产
arg="a"
,
value="1"
,
c=2
, 和
pos=-1
.我该怎么办?
n Nothing is expected; instead, the number of characters consumed
thus far from the input is stored through the next pointer,
which must be a pointer to int. This is not a conversion and
does not increase the count returned by the function. The as‐
signment can be suppressed with the * assignment-suppression
character, but the effect on the return value is undefined.
Therefore %*n conversions should not be used.
其中超过 50% 的段落是指簿记细节。没有讨论我所看到的行为。
%n
is implemented in vfscanf-internal.c ,我发现 60% 的代码(行)涉及关于标准不一致的讨论,39.6% 是实现细节,0.4% 是实际代码(由“
done++;
”组成)。
done
(我使用
%n
访问)未触及 - 或者更确切地说,未定义 - 除非某些操作更改它。似乎还使用
%n
以这种方式是无法预料的,而且我完全处于“这里有龙”的领域? :(
scanf
...
#include <stdio.h>
void test(const char *str) {
int pos = -1;
char arg[32] = {0}, value[32] = {0};
int c = sscanf(str, "%32[^=]=%32[^&]&%n", (char *)&arg, (char *)&value, &pos);
printf("\"%s\": c=%d arg=\"%s\" value=\"%s\" pos=%d\n", str, c, arg, value, pos);
}
int main() {
test("a=1&b=2"); // "a=1&b=2": c=2 arg="a" value="1" pos=4
test("a=1&"); // "a=1&": c=2 arg="a" value="1" pos=4
test("a=1"); // "a=1": c=2 arg="a" value="1" pos=-1
}
最佳答案
我认为 C 标准保证了 pos
的值在你的例子中保持不变。
C17 7.21.6.2 说,描述 fscanf
:
(4) The fscanf function executes each directive of the format in turn. When all directives have beenexecuted, or if a directive fails (as detailed below), the function returns. Failures are described asinput failures (due to the occurrence of an encoding error or the unavailability of input characters),or matching failures (due to inappropriate input).
[...]
(6) A directive that is an ordinary multibyte character is executed by reading the next characters of thestream. If any of those characters differ from the ones composing the directive,the directive fails andthe differing and subsequent characters remain unread. Similarly, if end-of-file, an encoding error,or a read error prevents a character from being read, the directive fails.
&
。)
"a=1"
例如,指令
%32[^=]
,
=
, 和
%32[^&]
一切都成功了,现在已经到了字符串的末尾。在 7.21.6.7 中解释了对于
sscanf
, "到达字符串的末尾等价于
&
指令失败,并且
sscanf
返回而没有做任何进一步的操作。
%n
指令从未执行过,因此没有发生任何事情将有权修改
pos
的值。因此它必须具有与之前相同的值,即 -1。
关于*scanf 中 %n 运算符的一致性和行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62630442/
我的运动需要一些帮助。 Question of exercise 这是我的代码: #include main() { int price,new_price; char code; printf(
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我有这段代码(由于逻辑是家庭作业
我这里有一段代码,在输入带空格的字符串时会出现一些不需要的行为。例如 print illegal_argument。当输入包含多个单词时,我希望它只注册第一个单词。 目前发生的是: christian
我的测试输入是 [1,2,3] [4,5,6] [7,8,9] [9,9] 或者它可以是单个 2d 坐标之前的任意数量的 3d 坐标,我的代码是 #include #include #includ
这个问题在这里已经有了答案: What does space in scanf mean? [duplicate] (6 个答案) 关闭 7 年前。 像这样在scanf中加一个空格的目的是什么 sc
#include int main() { int n; scanf("%d", &n); printf(n); return 0; } 这是我的代码,我很愚蠢,可能
程序要求用户输入 2 名学生的姓名、ID 等,将数据写入文件并从文件中读回数据。 #include #include #include #include #include int main(
这个问题在这里已经有了答案: abnormal behavior of scanf [duplicate] (3 个答案) 关闭 8 年前。 今天我遇到了一个问题,当我使用两次接受字符作为输入的 s
我正在用 c 编写一个程序来读取文件的内容。代码如下: #include void main() { char line[90]; while(scanf("%79[^\
main() { int d,a; printf("Enter the digit :"); scanf("%d",&d); printf("Enter another
为什么为 scanf 输入添加多个句点会跳过下一个 scanf 函数。示例输入:b. b. int main (void) { char b[7] = " "; printf("Thi
我想我已经尝试过任何方法(刷新 stdin、scanf 以使用换行符等),但没有任何效果如我所希望的那样。由于某种原因,第三个 scanf 在以下代码中修改了第二个 scanf 中的变量: #incl
这个问题在这里已经有了答案: Scanf skips every other while loop in C (10 个答案) 关闭 6 年前。 我想做一个计算器,只是一个带有循环和基本操作的简单计
如果没有初始化 ("mod=0") ,这段代码进入死循环。我不明白为什么这段代码会循环,即使我使用了 getchar();删除缓冲区。当我先输入“1”,然后再输入“a”时,就会出现无限循环。谁能帮助我
当我为 scanf() 输入一个值时 它只是跳过紧随其后的第二个、第三个和任何其他 scanf()。 这是我的代码: #define _CRT_SECURE_NO_WARNINGS #include
#include #include void sstring(); int main() { char ch1[10],ch2; printf("Ent
这是一个计算房间内人员年龄的简单程序。我正处于初始阶段,现在我看到我不知道哪些变量(我的意思是我在 scanf 之前声明的变量,然后是 scanf 中的占位符)用于 scanf;如何选择和应用正确的变
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 5 年前。 我知道 scanf() 的用法,
我已经阅读了扫描集的行为。通过研究和测试,我遇到了一个问题。 难道 scanf("%[^\n]") 的行为与 scanf("%s") 一样吗? scanf("%s") 正在消耗字符,直到在 stdin
我遇到了一个问题,当我使用 scanf 将字符串存储到 char 指针中时,我有 3 个输入 - 姓名、姓氏和年龄,姓氏的最后一个 char 值被替换为年龄输出以更好地解释。 Q-riosity v0
我是一名优秀的程序员,十分优秀!