###前提・実現したいこと
C言語で、文字列からある文字と文字の間にあるものをすべて抜き出したい。
例えば下のように<a>と<b>のタグがあり、その間の文字をすべて出力をしたいです。
<a> <b>
例1:<a><a>vvv<b>→<a>vvv
例2:<a>ai<b><a>aaa<b>→ai
aaa
###該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { //開始タグ、終了タグを入力 char tag[101]; fgets(tag, sizeof(tag), stdin); char *start, *end; start = strtok(tag, " "); end = strtok(NULL, "\n"); //文字列を入力 char tmp[5001]; fgets(tmp, sizeof(tmp), stdin); //アウトプット用 char memory; char output[5001]; int wordcnt = 0; //検索用 char *s; char *e; //囲んだ文字が見つかるまでループ while (1) { //開始タグで検索 if (( s = strstr(tmp,start) ) != NULL) { int searchS = atoi(s+strlen(start)); //見つかったら終了タグで検索 if ((e = strstr(tmp, end)) != NULL) { int searchE = atoi(e); //文字列の抜き出し strncpy(&memory, tmp+strlen(start), searchE-searchS); //文字列の配列に記録 output[wordcnt] = memory; //どちらか見つからなければ終了 }else break; }else break; wordcnt++; } //ループ終了 for (int i = 0; i < wordcnt; i++) printf("%s\n",output[i]); return 0; }
###試したこと
strncpyで文字列の抜き出しのみができるということで、文字列検索のstrstrを併用しました。
strstrの戻り値で、始まりの文字列と終わりの文字列を検索して、あれば2つの値を使い、strncpyで抜き出して全てを出力し、無ければループを抜けるという流れの予定なのですが、配列の数の分(5001回?)がnullで出力されてしまいます。
ループを抜けたいですが、検索できなくなったら抜け出すという方法が思いつきませんでした。
また、strncpyで入れた記憶用のmemoryという変数を出力した結果、これもnullでした。
他の変数については、
searchE、searchSはすべて0
tmpはテスト毎に数値は別
となっていました。
直すとすればどこでしょうか?そもそものやり方が間違っているかもわかりません。
###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio2015
win32 C++

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。