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次に、各文字列 (ここでも使用できます) を文字で分割するベクトルを調べます'='。キーと値を に入れるstd::mapか、直接使用することができます。

さらに C++ 固有のメソッドについては、の代わりにegstd::string::findとを使用します。次に、キーと値を一時的に文字列としてベクトルに格納する代わりに、マップに直接配置できます。std::string::substrstrtok

編集:最後のペアを取得する方法

最後のキーと値のペアは'&'文字で終了しないため、ループ後に最後のペアを確認する必要があります。これは、文字列のコピーを取得してから、最後の'&'. おそらくこのようなもの:

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 に答える