c++ sscanf忽略“&”并扫描过去它应该扫描的地方

yjghlzjz  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(126)

我正在使用一个.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

为什么它忽略了&,并继续将所有数据放入该变量?
到目前为止,我已经尝试将dataname的数据类型更改为std::string,但仍然没有成功。

zc0qhyus

zc0qhyus1#

%s是贪婪的。由于您没有告诉它在哪里停止,它将继续抓取输入,直到到达空白字符或空终止符(在您的情况下是后者)。
使用%[^&]代替。%[]类似于%s,只是它只抓取或忽略您指定的字符。这样,当&字符到达时,您可以告诉scanf()停止阅读输入。
无论哪种方式,都应该始终指定缓冲区宽度以避免溢出。
试试这个:

sscanf(data, "Name=%49[^&]&Port=%d&ID=%d&Config=%49s", &name, &port, &id, &config);

相关问题