どこがおかしいか見つかりましたら教えていただきたいです。
現在、自分はC言語で文字列検索の関数を簡単に作成しております。
条件
・ワイルドカード"+"があれば、任意の1文字へ置き換えることが可能とします。
以下に作成したコードを載せます。
C
1#include <stdio.h> 2#include <stdint.h> 3#include <string.h> 4 5#define FOUND (0) 6#define NOT_FOUND (1) 7#define ERROR (-1) 8#define TARGET_MAX (255) 9#define CHECK_MAX (255) 10#define WILDCARD ('+') 11 12typedef int8_t int8; 13typedef uint16_t uint16; 14int8 string_search(char* target_string, char* check_string, char* result); 15 16int main(int argc, char* argv[]) { 17 //argv[0]->起動プログラム 18 //argv[1]->第一引数(対象文字列) 19 //argv[2]->第二引数(検索文字列) 20 int8 ret;//戻り値を格納 21 char target[TARGET_MAX]; //対象文字列を格納 22 char check[CHECK_MAX]; //検索文字列を格納 23 char result[CHECK_MAX]; //見つけた文字列を格納(出力引数) 24 25 strcpy(target, argv[1]);//対象文字列(argv[1])をtargetに格納するためマジックナンバーを使用 26 strcpy(check, argv[2]);//検索文字列(argv[2])をcheckに格納するためマジックナンバーを使用 27 28 ret = string_search(target, check, result); 29 //結果の表示 30 if (ret == FOUND) { 31 printf("%s\n",result); 32 return FOUND; 33 } else if (ret == NOT_FOUND) { 34 printf("検索できませんでした。\n"); 35 printf("%s\n",result); 36 return NOT_FOUND; 37 } else { 38 return ERROR; 39 } 40} 41 42int8 string_search(char* target_string, char* check_string, char* result) { 43 uint16 target_len; //対象文字列の文字数を格納 44 uint16 check_len; //検索文字列の文字数を格納 45 uint8_t i_c; //ループ変数 46 uint8_t check_position; //検索文字の位置を指定するのに使用 47 uint8_t mem_position; //resultに記憶する時の要素を指定する時に使用 48 uint8_t result_len; //resultの文字数を格納 49 target_len = strlen(target_string); 50 check_len = strlen(check_string); 51 52 //入力された対象文字列、検索文字列の数を確認 53 if ((target_len > TARGET_MAX) || (check_len > CHECK_MAX)) { 54 return ERROR;//異常終了 55 } 56 57 check_position = 0; 58 mem_position = 0; 59 //検索開始 60 for (i_c = 0; i_c < target_len; i_c++) { 61 /*'+' または一致文字があった場合の処理*/ 62 if ((check_string[check_position] == WILDCARD) || (check_string[check_position] == target_string[i_c])) {//WILDCARDが検索文字列内に出現したら 63 result[mem_position] = target_string[i_c];//出力引数にコピー 64 result_len = strlen(result);//何文字出力引数にコピーしたか確認(このあたりがおかしいのかな?? 65 if (result_len >= check_len) { 66 //記憶した文字数が検索文字数と同じ数になれば終了 67 return FOUND; 68 } 69 check_position++; 70 mem_position++; 71 continue; 72 } 73 //それ以外の場合(検索文字にマッチしなかった場合 74 check_position = 0; 75 mem_position = 0; 76 } 77 return NOT_FOUND; 78}
テスト結果
1.(7文字の検索までならきちんと処理できています。
対象文字列 検索文字列 結果
abcdefghij +++++ abcde
2.(8文字以降は処理がおかしい)
なぜ8文字以降だと処理がうまくできていないのか原因がわからないです。
なので、気づいた方がいらっしゃいましたら是非教えていただけると、嬉しく思います。
以上です。
よろしくお願いいたします。
解決してるのでコメントだけ。
期待しない現象が起きた時に「おかしい」「うまくできていない」で切り捨ててしまうのではなく、起きた現象(例えば余計な文字列が付加されるとか)をきちんと捉えて「なぜそうなったか」を考えることは解決へのひとつのアプローチかと思います。
回答1件
あなたの回答
tips
プレビュー