2016-10-17 8 views
0

C、HTML、MySQL、CGIを使用してツイッターのようなプログラムを作成するように求められました。最初のステップは、ユーザにユーザ名とパスワードの入力を求めるログインページを作成することです。私はそれを行うにはCGIのXのHTMLを使用し、ここで私のプログラムは以下のとおりです。HTMLからのCGI-パスワードは印刷されません

HTML:

<html> 
    <body> 
    <form action='/cgi-bin/password .cgi'> 
    Username: <input type="text" name="user" ><br> 
    Password: <input type="password" name ="password" id="password" maxlength="10"> 
    <input type ="submit" value='Submit'> 
    </form> 
    </body> 
</html> 

CGI:

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

int main(void) 
{ 

char *data; 
char *token; 
printf("Content-type:text/html\r\n\r\n"); 
printf("<!DOCTYPE html><html><head><title>Is Your Password and username this?<title></head><body>"); 
data = getenv("QUERY_STRING"); 
    if (data) { 
     token = strtok(data, "&"); 
     while (token) { 
       while (*token != '=') 
       { 
       token++; 
       } 
      token++; 
      token = strtok(NULL, "&"); 
      } 
    printf("The average is %s\n", token); 
    } 
    printf("</body></html>"); 
    exit(EXIT_SUCCESS); 
} 

問題:ユーザ名とパスワードを入力し、送信ボタンを押した後、 CGIは何も印刷していません。それはちょうど空白のスペースです。これを修正し、ユーザー名とパスワードボックスに入力した内容を印刷するにはどうすればよいですか?ありがとう!

+0

クエリ文字列を解析するループ内には何も印刷しません。そして、 'token'ループは' NULL'(ループ条件の一部です)となり、 'NULL'ポインタを出力しようとします。 –

+0

@Joachim Pileborgユーザー名とパスワードを印刷するにはどうすればよいですか? strtok(データ)を次に出力する必要がありますか?私はちょっと残念ですが、残念です:(( –

答えて

0

getenvの文字列をコピーすることをお勧めします。あなたはgetenvから得る文字列を決して変更してはならず、strtokはそれを修正するべきです。

また、strtokを呼び出すと、name=valueペアの名前の先頭を指しています。ポインタ変数(token++で行う)を変更することで、開始位置が失われ、その名前へのポインタはなくなります。

次に、strchrのようなコードを単純化し、内部ループを持たないようにすることをお勧めします。

は、それが可能である場合は、

char *data_ptr = getenv("QUERY_STRING"); 
char data[strlen(data_ptr) + 1]; // +1 for the string terminator 
strcpy(data, data_ptr); 

char *name = strtok(data, "&"); 
while (name != NULL) 
{ 
    char *value_sep = strchr(name, '='); 
    if (value_sep != NULL) 
    { 
     *value_sep = '\0'; 
     char *value = ++value_sep; 

     printf("Name = %s\r\n", name); 
     printf("Value = %s\r\n", value); 
    } 
    else 
    { 
     printf("Malformed query string\r\n"); 
    } 

    name = strtok(NULL, "&"); 
} 

することができますsee it in "action" hereような何かを行うことができ、一緒にすべてを置きます。

+0

まだ動作していません。これを実行しようとしましたが、エラーが発生してコンパイルしましたので、試してみました: –

+0

char * data_ptr = getenv( "QUERY_STRING");.今コンパイルされますが、まだ空白のページが表示されます。 –

関連する問題