いつも,クオリティの高いご回答いただきお世話になります。
現在,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がなくても整数値が返却されるのでしょうか?
ご教授のほどよろしくお願いいたします。




回答5件
あなたの回答
tips
プレビュー