1

这是我用 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))

执行此代码后,我得到了变量“数据”的以下结果。

f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=

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

4

1 回答 1

5

检查例如strtok功能。在循环中使用它来拆分,'&'以将所有键值对组合成一个向量(例如)。然后在字符处查看分割每个字符串的向量(您可以strtok在此处再次使用)'='。您可以将键和值放在 a 中std::map,或直接使用。

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

于 2012-08-14T12:41:22.927 回答