- ベストアンサー
配列の添え字の計算について
sea_clear_sky8です。 CGIのGETまたはPOSTからのクエリストリングの値 を処理していることはわかりますが、 次ののコードの計算の結果がわかりません。 value[nCur] = src + i + 1; name[nCur] = src + i +1; 配列に添え字をどうしているのか意味がわかりません。 ご教授願います。 よろしくお願いします。 [コード] int urlSplit( char *src, char **name, char **value ) { int i,nCur; nCur = 0; if( src[0] == 0x00){ /* srcの中身がない時は0 */ return 0; } /* 1つ目のnameにまずすべてセット */ name[0] = src; /* 1文字ずつずらしていって切り分け */ for( i = 0 ; src[i] != '\0' ; ++i ){ /* = が見つかったときは、valueにセット */ if ( src[i] == '=' ){ /* 前name値のラストにする */ src[i] = '\0'; この行の計算です。 value[nCur] = src + i + 1; } /* & が見つかったときは、 フィールド1つ増やしてnameにセット */ if( src[i] == '&' ){ /* 前Value値のラストにする */ src[i] = '\0'; nCur++; この行の計算です。 name[nCur] = src + i +1; } } return (nCur+1); } int main() { int i,nFields; int nLength; char *query; char *name[2]; char *value[2]; nFields = urlSplit( query, name, value ); ]
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下のように書き直したら、意味が判ると思います。 int urlSplit( char src[], char *name[], char *value[] ) { int i,nCur; nCur = 0; if( src[0] == 0x00){ /* srcの中身がない時は0 */ return 0; } /* 1つ目のnameにまずすべてセット しているのではなく、単に、srcの先頭をセット */ name[0] = &src[0]; /* 1文字ずつずらしていって切り分け */ for( i = 0 ; src[i] != '\0' ; ++i ){ /* = が見つかったときは、valueにセット */ if ( src[i] == '=' ){ /* 前name値のラストにする */ src[i] = '\0'; value[nCur] = &src[i + 1]; } /* & が見つかったときは、 フィールド1つ増やしてnameにセット */ if( src[i] == '&' ){ /* 前Value値のラストにする */ src[i] = '\0'; nCur++; name[nCur] = &src[i + 1]; } } return (nCur+1); } srcの文字列に=や&が見付かるたびに、=と&を文字列の終端記号の「'\0'」に置き換えつつ、その次の文字の位置(アドレス)をname配列やvalue配列に格納しているのです。 srcが "count=1&no=103&year=2008"+'\0' であれば "count"+'\0'+"1"+'\0'+"no"+'\0'+"103"+'\0'+"year"+'\0'+"2008"+'\0' になり、nameとvalueの配列は name[0]⇒srcの先頭、つまり「"count"」の先頭 value[0]⇒1つ目の'\0'の次の文字の位置、つまり「"1"」の先頭 name[1]⇒2つ目の'\0'の次の文字の位置、つまり「"no"」の先頭 value[1]⇒3つ目の'\0'の次の文字の位置、つまり「"103"」の先頭 name[2]⇒4つ目の'\0'の次の文字の位置、つまり「"year"」の先頭 value[2]⇒5つ目の'\0'の次の文字の位置、つまり「"2008"」の先頭 のようになります。 そして、返り値がnCur+1、つまり「3」になって返ります。
その他の回答 (2)
- D-Matsu
- ベストアンサー率45% (1080/2394)
> value[nCur] = src + i + 1; > name[nCur] = src + i + 1; 意味としては、以下のコードと同じことをしています。 value[nCur] = &src[i + 1]; name[nCur] = &src[i + 1]; aaa=bbb&ccc=ddd という感じの文字列を"="と"&"をセパレータにして name[0] = "aaa" value[0] = "bbb" name[1] = "ccc" value[1] = "ddd" と分割する処理のようですね。 途中を配列として書いてるんだからそっちに統一しとけばいいのに、とは思います。
お礼
回答ありがとうございます。 参考になります。 ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
srcというポインターを(i+1)要素分だけ進めた場所を指しています。
お礼
回答ありがとうございます。 簡潔にわかりやすく教えて頂いてありがとうございます。
お礼
回答ありがとうございます。 詳しく教えて頂いてありがとうございます。 大変、参考になりました。