0

以下のhtmlコードがあります。

<html>
<head><title>OPTIONS</title></head>
<body>
    <p>Choose schedule to generate:</p>
    <form action='cgi-bin/mp1b.cgi' method="get">
    <input type=checkbox value='tfield' name=on />Teacher<input type=text name="teacher" value=""/><br>
    <input type=checkbox value='sfield' name=on />Subject<input type=text name="subject" value=""/><br>
    <input type=checkbox value='rfield' name=on />Room<input type=text name="room" value=""/><br>
    <input type=submit value="Generate Schedule"/>
    </form>
</body>
</html>

そして、Cで書かれたこのCGIスクリプトがあります:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *data = malloc(1024);
    char teacher[1024];
    char subject[1024];
    char room[1024];
    printf("Content-type:text/html\n\n");
    printf("<html><body>");
    data = getenv("QUERY_STRING");
    if(data){
        sscanf(data,"teacher=%s&subject=%s&room=%s",teacher,subject,room);
        printf("%s,%s,%s",teacher,subject,room);
    }
    printf("</body></html>");
    return 0;
}

送信ボタンをクリックするたびに出力されます

(null),ã…,œí

コードの何が問題になっていますか? ありがとう!

編集済み: コードは編集されていますが、次のように出力されます。

Smith&subject=Physics&room=部屋,Xøm·l,

4

1 に答える 1

0

teacher最初に、、、subjectおよびにメモリを割り当てませんでしたroom。固定サイズのブロックで修正しました。これは、文字列が決して長くならないことが 100% 確実な場合の解決策です (奇妙なエラー状況でも)。

にメモリを割り当てる必要はありませんdata

Achar*は文字列へのポインタにすぎません。実際の のストレージ スペースはありませんchar

できるよ:

...
data    = getenv("QUERY_STRING");
teacher = malloc(strlen(data) + 1);
subject = malloc(strlen(data) + 1);
room    = malloc(strlen(data) + 1);

常に十分なメモリ ブロックを取得します。を忘れないでくださいfree()

また、その戻り値があなたの場合sscanf()であることを確認3してください。あなたの場合、最初の文字列scanf()と見なさSmith&subject=Physics&room=Roomれるため、1 が返されます。したがってsubjectroomと にはランダムなスタック ガベージが含まれます。これが、最初の,. その理由はscanf()、非常に単純なパーサーだからです。空白を見つけると、次の文字列を探し始めます。入力には空白が含まれていないため、URL パラメータ リストの残りの部分全体が最初の文字列として消費されます。機能するより高度な形式については、以下を参照してください。

文字列を解析するには、 をご覧くださいstrtok()。を使用するときは、 によって返される文字列が文字列を変更するためstrtok()、最初にコピーを作成する必要があります。getenv()strtok()getenv()

または、 を検索する文字列を while ループします&

ただし、こちらの例に示すように、sscanf()withを使用して URL パラメーターを解析することもできます。[^&]

一方、適切な文字に変換し直す必要があるエスケープ シーケンスが存在する可能性があるため、URL を正しく解析するのは大変な作業です。したがって、これを自分でコーディングするよりも、既存のライブラリを使用する方がよいでしょう。

于 2013-08-18T09:29:59.607 に答える