从 cgi POST 数据中获取输入
Get input from cgi POST data
这是我使用 cgi 检索 html 数据的 c++ 代码。
char* fileContentLength;
int nContentLength;
fileContentLength = getenv("CONTENT_LENGTH");
if(fileContentLength == NULL)
return -1;
nContentLength = atoi(fileContentLength);
if(nContentLength == 0)
return -1;
data = (char*) malloc(nContentLength+1);
if(data == NULL)
return -1;
memset(data, 0, nContentLength+1);
if(fread(data, 1, nContentLength, stdin) == 0)
return -1;
if(ferror(stdin))
执行此代码后,我得到了变量"data"的以下结果。
f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=
这里的f0,l0,f1,l1是HTML页面输入框的名称。从这个字符串中,我需要分隔 fname0、lname0、fname1、lname1 等值。我使用了 sscanf 函数。但我无法检索正确的结果。如何将上述字符串中的值分配给名为名字和姓氏的局部变量。
例如查看strtok
函数。在循环中使用它在'&'
处拆分,将所有键值对转换为向量(例如)。然后遍历向量拆分每个字符串(您可以在此处再次使用strtok
)在'='
字符处。您可以将键和值放在std::map
中,也可以直接使用。
对于更特定于C++的方法,请使用例如 std::string::find
和std::string::substr
而不是strtok
.然后,您可以将键和值直接放入映射中,而不是将它们临时存储为向量中的字符串。
编辑:如何获得最后一对
最后一个键值对不会由'&'
字符终止,因此您必须在循环后检查最后一对。这可以通过拥有字符串的副本来完成,然后在最后一次'&'
之后获取子字符串。也许是这样的:
char *copy = strdup(data);
// Loop getting key-value pairs using `strtok`
// ...
// Find the last '&' in the string
char *last_amp_pos = strrchr(copy, '&');
if (last_amp_pos != NULL && last_amp_pos < (copy + strlen(copy)))
{
last_amp_pos++; // Increase to point to first character after the ampersand
// `last_amp_pos` now points to the last key-value pair
}
// Must be free'd since we allocated a copy above
free(copy);
我们需要使用字符串副本的原因,如果strtok
修改了字符串。
我仍然建议您使用C++字符串,而不是依赖旧的 C 函数。它可能会简化一切,包括您不需要为最后一个键值对添加额外的检查。
相关文章:
- 如何从用户那里获取输入并将其存储在向量中?
- 代码在执行之前终止,并且没有从用户那里获取输入
- 从用户获取输入/输出
- TFLite 隔离错误,通过获取C++输入和输出
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 使用 qt 或 c++ 从桌面获取输入和输出
- 您如何在C++中不断获取输入?
- 从源代码本身C++获取输入
- 函数,从问题中获取输入,并在主函数中使用该输入
- 当我们声明 cin 为 int 并从 cin 中获取输入并在 cout 中打印 cin 时会发生什么?
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 从用户获取输入
- 我需要编写一个代码,从用户那里获取输入(句子)并停止在@处
- C 程序在获取输入[控制台应用程序]时跳过行
- 我在C++从函数中的用户获取输入、添加到数组和打印该数组时遇到问题
- 从用户那里获取输入,直到他输入一个数字
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- getline 语句未获取输入
- 用户定义的功能用于竞争编程中,以获取输入