私が使っているマシンはWin98なのですが、ここにWindows付属のPersonalWebSaverをインストールし、
イントラネットを構築するようにしました。
そこで見れるページをVC++4(中身はまったくCです)を使いCGIを
作成することにしました。
そこでCGIを作るにあたり、送信されたきたURLにあるパラメータ(&aaa=xxx)などを解析する処理を
入れたいのですが、どのような処理させればよろしいのでしょうか?
サンプルなどご紹介していただけると大変嬉しいです。
では宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

POSTとGETによりパラメータの取得方法が異なります。


環境変数「REQUEST_METHOD」によりPOSTかGETかを判断します。POSTの場合は標準入力からGETの場合は環境変数「QUERY_STRING」からパラメータを取得します。取得したパラメータはエンコーディングされているので、処理可能な文字列に変換する必要があります。

パラメータの取得方法のサンプル
/* REQUEST_METHOD環境変数の取得 */
MethodPtr=getenv("REQUEST_METHOD");
/* METHOD==POST */
if(0==memcmp(MethodPtr,"POST",4))
{
/* CONTENT_LENGTH環境変数の取得 */
ContentLengthPtr=getenv("CONTENT_LENGTH");
/* 標準入力より読込み */
ReadSize=read((int)0,QueryStr,ContentLength);
}
/* METHOD==GET */
else if(0==memcmp(MethodPtr,"GET",3))
{
/* QUERY_STRING環境変数の取得 */
WkQueryStr=getenv("QUERY_STRING");
QueryStr = malloc( strlen(WkQueryStr)+1 ) ;
strcpy( QueryStr , WkQueryStr ) ;
}

こんな感じです。

パラメータの取得サンプル

WorkPtr = (char *)strstr( QueryStr , "code=" ) ;
WorkPtr+=5; /* "code="の文字数分インクリメント */
do{
  if(NULL==*WorkPtr || '&'==*WorkPtr)
{
break;
}
wk_code[strlen(wk_code)]=*WorkPtr;
WorkPtr++;
}while(1);

こんな感じです。

パラメータのエンコーディングの解凍方法については参考URLを参照すれば理解出来ると思います。

参考URL:http://www.iroiro.org/cgi/index.html

この回答への補足

早速のご回答ありがとうございます。
ひとつ気になるところがあるのですが、上記コーディングで...

QueryStrはchar型のポインタ変数だと思いますが、METHODの形式が"POST"であった場合
QueryStrの領域は確保する必要性はあるのでしょうか?
上記コーディングを見たところ"POST"であった場合、malloc()での領域確保処理が
内容なので気になってはいるのですが...

教えていただた身で大変恐縮ではありますが、確認のために補足として
記述させていただきました。宜しくお願い致します。

補足日時:2001/03/28 14:56
    • good
    • 0

METHODの形式が"POST"の場合も当然メモリの確保をする必要があります。


下の人は恐らく書き忘れたのでしょう。

PWSを使用といことなのでこのページはかなり参考になるのではないでしょうか?

  http://www.argus.ne.jp/hsp/setup/pwscgi.html


パラメーターの解析としてはパラメーターを取得後エンコードされた文字を
デコードする必要があります。

サンプルソース

/*************** 日本語にデコードする  ****************/

void decode(char *url)
{
int i, j;
for(i = 0, j = 0; url[j]; ++i, ++j){

if((url[i] = url[j]) == '%'){
url[i] = tochar( &url[j + 1]);
j += 2;
}
else if (url[i] == '+')
url[i] = ' ';
}
url[i] = '\0';
}

char tochar(char *x)
{
register char c;

c = (x[0] >= 'A' ? ((x[0] & 0xdf) - 'A') + 10 : (x[0] - '0'));
c *= 16;
c += (x[1] >= 'A' ? ((x[1] & 0xdf) - 'A') + 10 : (x[1] - '0'));

return c;
}

tocharで行っている処理をsscanfを使って処理するともっとすっきり
かけます。
こんな感じでいかがでしょ?
    • good
    • 0

UNIXでの経験しかないのでWindowsでは違うかもしれませんが。


パラメータにはGETとPOSTがありますが、たぶん質問されているのは
GETの場合だと思われます。
GETのパラメータは環境変数"QUERY_STRING"に格納されます。
それをgetenv()関数で取得します。
取得した文字列より目的のパラメータの値を取り出せばOKです。
POSTの場合は、標準入力(stdin)できますので、その中身を
readすれば中身を取得できます。
Windowsは違っていたらゴメンナサイ。
    • good
    • 0
この回答へのお礼

早速のアドバイスありがとうございます。
こちらでWindowsで試したところうまく動作してくようでした。
自分でもUNIXしかダメなのかなとあきらめつつやってみたところ、
WinもUNIXも同様のようでした。
OSは違うとも考え方は一緒なんですね。

お礼日時:2001/03/28 14:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QPOSTで送信するとエラーになる

 ボタンでHPに飛ばしているのですが、エラーになる場合があって困っています。

 コードは以下の通りです。
   <FORM action="http://www.xxx.yy.zz/" method="POST">
    <INPUT type="submit" value="HPへ">
   </FORM>

 指定したURLによってエラーになるところとならないところがあるのですが、これはサーバ内のどこの設定によるものなのでしょうか?
 (試しにgooやYahooを指定するとOKなのですが、googleやlycosはダメのようです。
 エラーの場合、「400 BadRequest」や「HTTP 405 - リソース未許可」などが出ます。
 しかもlycosでは、自社エラーページを表示しているのですが、どういう設定なのでしょう?)

 現行ではmethod="GET"としている(これなら上記エラーは出ない)のですが、これだとURLの後ろに「?」がついてしまって、これによってエラーになってしまうHPがまれにあって、これまた困っています。
 (JavaScriptは使用不可で、文字リンクもダメという方針なので、画像リンクしかないかなぁと思っているのですが。)

 もしJavaScriptも画像も使わずに、ボタンで、URLに?を出さない方法があったら、是非教えてください。
 (1番知りたいのは、↑これです)

以上よろしくお願い致します。

 ボタンでHPに飛ばしているのですが、エラーになる場合があって困っています。

 コードは以下の通りです。
   <FORM action="http://www.xxx.yy.zz/" method="POST">
    <INPUT type="submit" value="HPへ">
   </FORM>

 指定したURLによってエラーになるところとならないところがあるのですが、これはサーバ内のどこの設定によるものなのでしょうか?
 (試しにgooやYahooを指定するとOKなのですが、googleやlycosはダメのようです。
 エラーの場合、「400 BadRequest」や「HTTP...続きを読む

Aベストアンサー

こんにちは、honiyonです。

 POSTを、index.htmlに対して試してみました。

 結果は、
  The requested method POST is not allowed for the URL /index.html.
 という事で、察するに *.htmや、*.htmlに対しては POSTメソッドは門前払いという事になりそうです。 CGIに対してしかダメという事になりそうですね~。
 使用したサーバーは、Linux + Apache です。

 送信すべきデータがある/ない以前の問題でしたね(^^;
 今回のケースではPOSTメソッドは無理、という事になりそうですね。 少なくともApacheの設定で、「POSTを全てのケースで許可」というのはなかったと思います。 他のWWWサーバーで、HTMLに対してもPOSTを許可してくれるものがあればよいのですが(^^;

 参考になれば幸いです(..

QC言語での文字列取得についてです。

 いつもお世話になっております。

 例えば、"AAA=C:\aabbcc\ddd"のような文字列があります。C言語だと、この文字列の"C:\aabbcc\"部分だけ抜き出す方法がわかりません。

 すいませんが、教えてください。

 

Aベストアンサー

今時string型を使わないでプログラムを組むのは時間の無駄です
これは最近のほとんどのC/C++コンパイラで使えます
char s[256]に問題の文字列が入っているとします

#include <string>
#include <iostream>
using namespace std;

void main(void)
{
chars[256];
stringstr;

strcpy(s,"AAA=C:\\aabbcc\\ddd");cout<<s<<endl<<endl;
str=s;
cout<<"前の削除"<<endl;
str.erase(0,str.find('=')+1);
cout<<str<<endl;
cout<<"後の削除"<<endl;
str.erase(str.find_last_of('\\')+1);
cout<<str<<endl;
}

結果:

AAA=C:\aabbcc\ddd

前の削除
C:\aabbcc\ddd
後の削除
C:\aabbcc\

なおリンクの無償ボーランドC++5.5でやりました

参考URL:http://www.borland.co.jp/cppbuilder/freecompiler/

今時string型を使わないでプログラムを組むのは時間の無駄です
これは最近のほとんどのC/C++コンパイラで使えます
char s[256]に問題の文字列が入っているとします

#include <string>
#include <iostream>
using namespace std;

void main(void)
{
chars[256];
stringstr;

strcpy(s,"AAA=C:\\aabbcc\\ddd");cout<<s<<endl<<endl;
str=s;
cout<<"前の削除"<<endl;
str.erase(0,str.find('=')+1);
cout<<str<<endl;
cout<<"後の削除"<<endl;
str.erase(str.find_last_...続きを読む

QHTML上(javascript)からCGIを実行する方法

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTMLファイルの一部にcgi処理結果を表示させたいものです。

そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの
実行結果を表示する事は出来ないのでしょうか。
よろしくお願い致します。

※下例のプログラムではcgi結果は表示されませんでした・・・。

---<index.htm>----------------------------------------
<HTML>
<BODY>
<SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT>
</BODY>
</HTML>

---<test.cgi>----------------------------------------
#!/usr/bin/perl

print "test"

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTML...続きを読む

Aベストアンサー

「Google AdSense」のjavascriptでは#1さんの回答にもありますがiframeを使用するような仕掛けになっているようです。
・javascriptでiframeを展開。
・iframeのsrcでcgiを指定。

>外部cgiでjavascriptを生成する仕組みを作り、その生成されたjavascriptを参照するという間接的な仕組みを設ければ可能になる
そういう仕組みも可能です。
また、直接的に<script type="text/javascript" src="xxxx.cgi"></script>
こういう書き方も可能です。
※xxxx.cgiでは処理結果をjavascriptのコードとして
print "Content-Type: application/x-javascript\n\n";
print "document.write('xxxx');";
みたいにして吐き出す必要があります。

Qネットワーク切断を検出するには?

Linux上で動作するTCP/IP通信アプリケーションが、LANケーブル抜けによるネットワーク切断を検知するにはどうしたらよいのでしょうか?

外部からコネクションを確立した後にケーブルが抜けたとき、Linux側でソケットをcloseしたいのです。今はこれができておらず、接続状態のまま(netstatでみるとESTABLISHED)になっています。複数の接続を許していないので、ケーブルを繋いだあとにTCP/IPで再接続できません。

試したこと
ソケットに対するioctl(2)でifreq.ifr_flagsのIFF_UPフラグをみたけど検知不可
切断時にselect(2)がエラーリターンするかと思ったがだめ

ケーブルが抜けたとき、カーネルが eth0: link down とログに出力するのでどこか(/proc , /sys以下)を参照すればよさそうな気がするんですが…

Aベストアンサー

HP-UXなので微妙に異なる可能性はありますが、こんな感じです。
http://docs.hp.com/ja/B2355-60129/TCP.7P.html

QinputタグのテキストBOXだけ右寄せにする方法

inputタグのボタンやテキストBOXが混在しているページがあります。
この中のテキストBOXだけ右寄せにしたいと思っています。

原始的なJavaSctiptは使わずに、かつID指定・class指定なしに。
シンプルにきれいに、が希望です。1つ1つ指定というのはしたくないです。

昔はJavaScriptでinputタグのものを全部持ってきて
全ループさせながらtypeを判定しテキストBOXのものだけを
どうこうするとか書きましたが、原始的なので書きたくありません。
というかもう少しスマートな書き方はないものかと思い
質問をすることにしました。


スタイルシートだけで書ければいいなと思いますがこれを知りません。
input:text {…}
みたいな書き方があればいいなと思っています。

これがダメな場合でもprototypeやjquery等のライブラリを使用し
シンプルなJavaScriptの記述で実現できればそれを知りたいです。


・原始的なJavaScriptは使わない
・id・class指定のスタイルシートは使わない
・スタイルシートだけでテキストBOXだけを右寄せにする方法
・JavaScriptライブラリを使用してテキストBOXだけを右寄せにする方法
・スタイルシート単独もJavaScriptライブラリを使用しても出来ない場合は
 「出来ない」との明言を

こんな感じでお願いします。
よろしくお願いします。

inputタグのボタンやテキストBOXが混在しているページがあります。
この中のテキストBOXだけ右寄せにしたいと思っています。

原始的なJavaSctiptは使わずに、かつID指定・class指定なしに。
シンプルにきれいに、が希望です。1つ1つ指定というのはしたくないです。

昔はJavaScriptでinputタグのものを全部持ってきて
全ループさせながらtypeを判定しテキストBOXのものだけを
どうこうするとか書きましたが、原始的なので書きたくありません。
というかもう少しスマートな書き方はないものかと思い
質...続きを読む

Aベストアンサー

はじめまして。
CSSだけで実現する方法としては属性セレクタ(Attribute selectors)と呼ばれる指定方法があります。ただしこれは、一般的なモダンブラウザでは対応しているはずですがIE6以下では反応しません。

書き方としては、
[attribute=value]

inputの1行テキストボックスだけに適応させるには、
input[type="text"] { (ここにスタイル) }

という書き方ができます。
ご参考になれば幸いです。

QC++で文字列の右端から特定の文字までの文字列を

C++で文字列の中から,文字列の右端から特定の文字までの文字列を取り出すというものを作りたいと思っています。

右端から○文字取り出す。といった感じのコードは書けるのですが、特定の文字まで、というのがどうもうまくいきません。こちら、良いアドバイスをいただける方がいましたらよろしくお願いします。

例:ファイル名を抽出
文字列\system32\notepad.exeからnotepad.exeの部分だけを取り出したい。というものです。
初めに見つけた\まで取り出す・・とやればよいのでしょうが、その方法が今ひとつ良くわからないので、どうかご助力お願いいたします。

Aベストアンサー

具体的なコードにもよりますが、

> 右端から○文字取り出す。といった感じのコードは書けるのですが

だったら、ほぼできていると思います。

char src[1000]; に文字列が入っているとして、

そのコードに、

int j = src[] にある、最後の文字を示すインデックス
for(int i = 0; i < ○; i++)
{
src[j] を取り出す;
j--;
}

という部分があるなら、

while(src[j] != '\\')

に書き直すだけ。

または、

for(int j = src[] にある、最後の文字を示すインデックス; (j >=0 ) && src[j] != '\\'; j--)

にするとか。

でも、「どうもうまくいきません」なら、「こういうことをしたら、こうなってしまいました」というのがあるほうが親切ですね。

QC++ 文字列変数と16進数の比較

すみません、初心者です。

char型の変数に格納されている値と16進数の値を
比較して一致したかどうか見たいのですが
どのようにすればできますでしょうか?

/* 16進=0x1041 (10進=4161) */
char * str = "4161";

0x1041の16進は比較するときに直に書くとします。

このサイトで調べたら16進の値を10進に変換するような
記載もありましたが、変換してして比較すれば良いのでしょうか?

やり方を記載して頂けないでしょうか。

宜しくお願いします。

Aベストアンサー

Cには「文字列型」がないので初心者では仕方ない面もありますが、「文字列」を表現するときの型は「char型」ではおかしいです。

よくある勘違いですが、数値は10進表記でも16進表記でも内部での持ち方は一緒です。
ですから、比較式

0x1041 == 4161

の結果は真になります。要するに「単純にstrを数値変換して入力値と比較する」でOK。
ただし、数値変換はatoiよりはstrtolの方がベターです。書式は面倒ですが、atoiだと入力エラーがチェックできないので。

今回のケースならsprintfで入力値を16進表記文字列に変換してstrcmpで文字列比較なんて手も使えますが、まぁ普通は使いません。


人気Q&Aランキング