いつも,クオリティの高いご回答いただきお世話になります。
現在,PHPスクリプトの以下のような関数と同様の関数をC言語で実装しようとしています。
再現したいのは
http://php.net/manual/ja/function.strpos.php
上記の関数です。
機能は,第二引数を第一引数の文字列から検索し最初に見つかった位置を返す関数です。
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <malloc.h> 5 6 7int php_strpos(char* search, char* needle) { 8 // 検索文字 9 int needle_length = strlen(needle); 10 // 検索対象 11 int search_length = strlen(search); 12 // needleの先頭の値と同じバイト数が見つかった位置 13 int inner_i; 14 // フラグ 15 int flag = 0; 16 // 検索文字が検索対象より短い場合のみ検証 17 if (needle_length <= search_length) { 18 for (int i = 0; i < search_length; i++) { 19 if (*(search + i) == *(needle)) { 20 inner_i = i; 21 for (int k = 0; k < needle_length; k++) { 22 if (inner_i + k < search_length) { 23 if (*(needle + k) == *(search + inner_i + k)) { 24 flag = 1; 25 } else { 26 flag = 0; 27 continue; 28 } 29 } 30 } 31 if (flag == 1) { 32 return (inner_i); 33 } 34 } 35 } 36 return (-1); 37 } else { 38 return (-1); 39 } 40} 41 42int main (int c, char* param[]) { 43 int offset; 44 offset = php_strpos("あいうえおABCDEニードルテスト", "ニードル"); 45 printf("->%d<-", offset); 46 printf("\r\n"); 47} 48 49
上記の内容で大方の動作は確認できたのですがphp_strposという関数の中身でreturnをしている箇所がありますがふとした時に
C
1int php_strpos(char* search, char* needle) { 2 // 検索文字 3 int needle_length = strlen(needle); 4 // 検索対象 5 int search_length = strlen(search); 6 // needleの先頭の値と同じバイト数が見つかった位置 7 int inner_i; 8 // フラグ 9 int flag = 0; 10 // 検索文字が検索対象より短い場合のみ検証 11 if (needle_length <= search_length) { 12 for (int i = 0; i < search_length; i++) { 13 if (*(search + i) == *(needle)) { 14 inner_i = i; 15 for (int k = 0; k < needle_length; k++) { 16 if (inner_i + k < search_length) { 17 if (*(needle + k) == *(search + inner_i + k)) { 18 flag = 1; 19 } else { 20 flag = 0; 21 continue; 22 } 23 } 24 } 25 if (flag == 1) { 26 // return (inner_i); 27 } 28 } 29 } 30 // return (-1); 31 } else { 32 // return (-1); 33 } 34}
上記のようにreturnの箇所をコメントアウトしました。
すると
main関数の中のprintfがなんらかの整数値を返すという結果がでました。
ただその数値がどこが原因で返却されているのかがわかりません。
どこが原因で関数内にreturnがなくても整数値が返却されるのでしょうか?
ご教授のほどよろしくお願いいたします。
php_strpos()関数の中の、3つのreturn文をコメントアウトすると、main()のprintf()が値を返すことがわかった・・・どんな経緯でわかったのか、謎めいた話です。少なくとも、このままでは理解できない話です。もしかして、こういうことですか? 「(例えば、どこでリターンするか、printfデバッグをしようとして?)return文の代りにprintf()文を書いた、そうしたら、そのprintf()が返したと思われる値がmain()関数の offset変数に代入されたようだ、即ち、printf()の返した値がphp_strpos()関数の戻り値になったように見えた・・・」というようなことですか?
こんばんわ,経緯としては,関数の処理を記述している最終に動作チェックで都度コンパイルしていたんですけど,当初その際にループを抜けた先にたまたまreturn文がなかったようです。それにしてはなぜかint型の値が帰ってきてたので?となったわけです
全然、合点がいきません。それはphp_strpos()関数を修正していたのではないのですか?「php_strpos()の中のprintf()が整数値を返す」だったら理解できますが、何故それが「main関数の中の」printf()が整数値を返す、になったのですか?
お使いのCコンパイラはGCCですか?32bit/64bitいずれでしょうか?それと、アセンブリ言語に触れた経験はお持ちですか?おありなら、CPUの種類もお聞かせ願えればと思います。
>何故それが「main関数の中の」printf()が整数値を返す、になったのですか? でなかったですね,php_strposの返り値です。それをprintfしていたとき出力された値が整数値だったので何故returnがないのに値がかえってくるのだろうか?となったわけです。ちなみに全く低級言語の経験はありませんよ。
つまり、こういうことですか? printf()関数が整数値を<返した>ことを問題にしているのではない。 printf()が整数値を<表示した>、即ち main()関数の中のprintf()が整数値を<表示>した、 その値は、return文を持たないのにphp_strpos()関数が返した値のようだ・・・
はい,返り値を返したと表現した対象の関数を誤っていましたね...失礼しました。
何が疑問の核心なのか、ようやく理解できた感じです。まあ、ありがちな疑問であって、既に回答がついているじゃないかと、私なんかは思うのですが、、アセンブリ言語の経験が皆無だとすれば、ピンとこないのでしょうね、、、
回答5件
あなたの回答
tips
プレビュー