我正在使用一个.cpp
文件,我编译它作为一个.cgi
文件在我的网站上运行,从一个Web表单接收数据,然后运行sscanf()
来获取从发送的格式中提取的数据。
然而,当数据被传入并解析时,第一个字符串会将所有输入都传递到它应该到达的地方。
我的CPP文件:
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main(void) {
printf("Content-Type: text/plain;charset=us-ascii\n\n");
printf("Hello world\n\n");
char* data;
data = getenv("QUERY_STRING");
char name [50];
int port;
int id;
char config[50];
sscanf(data, "Name=%s&Port=%d&ID=%d&Config=%s", &name, &port, &id, &config);
printf("%s", name);
return 0;
}
data
变量是Name=ss&Port=8081&ID=0&Config=testconfig
。
我的预期输出:
Hello world
ss
我的实际输出:
Hello world
ss&Port=8081&ID=0&Config=testconfig
为什么它忽略了&
,并继续将所有数据放入该变量?
到目前为止,我已经尝试将data
和name
的数据类型更改为std::string
,但仍然没有成功。
1条答案
按热度按时间zc0qhyus1#
%s
是贪婪的。由于您没有告诉它在哪里停止,它将继续抓取输入,直到到达空白字符或空终止符(在您的情况下是后者)。使用
%[^&]
代替。%[]
类似于%s
,只是它只抓取或忽略您指定的字符。这样,当&
字符到达时,您可以告诉scanf()
停止阅读输入。无论哪种方式,都应该始终指定缓冲区宽度以避免溢出。
试试这个: