从cgi POST数据获取输入

时间:2012-08-14 12:31:27

标签: c++ post input cgi scanf

这是我用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&安培; 10 = lname0&安培; F1 = fname1&安培; L1 = lname1&安培; F2 = fname2&安培; L2 = lname2&安培; F3 =&安培; L3 =

这里f0,l0,f1,l1是HTML页面的输入框的名称。从这个字符串我需要分隔像fname0,lname0,fname1,lname1等值。我使用了sscanf功能。但我无法检索到正确的结果。如何将上述字符串中的值分配给名为firstname和lastname的局部变量。

1 个答案:

答案 0 :(得分:4)

查看例如strtok功能。在循环中使用它在'&'处拆分以将所有键值对转换为向量(例如)。然后通过向量分割每个字符串(您可以在此处再次使用strtok)来查找'='字符。您可以将键和值放在std::map中,也可以直接使用。

对于更加特定于C ++的方法,请使用例如std::string::findstd::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函数。它可能会简化一切,包括您不需要为最后一个键值对添加额外的检查。