CかC++でこんな関数ありますか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Ciel
記事: 252
登録日時: 9年前

CかC++でこんな関数ありますか?

#1

投稿記事 by Ciel » 8年前

お世話になります。

超くだらない質問なんですが、
あるポインタから、あるポインタまでの文字を取得できるって関数ありますか?

例えば、

#ABC#あいうえおかきくけこ#/ABC#

という文字列がバッファにあったとして、
#ABC#と#/ABC#はstrstr等でその位置を取得できますが、
その間の文字である、「あいうえおかきくけこ」を取得したいんです。

当然この中の文字は可変です。文字数も変わりますし、どんな文字が入るのかも分かりません。

前後のポインタさえ取得できれば、その間の文字を取得できるような関数があればなーと思ってるんですが、
そんな関数ありますでしょうか?

なければ、他の方法でも良いです。

何も無ければ自分で何とかします。

よろしくお願いします。
oui C'est la Vie♪

アバター
a5ua
記事: 199
登録日時: 9年前

Re: CかC++でこんな関数ありますか?

#2

投稿記事 by a5ua » 8年前

C言語なら、strncpyを使うのがいいと思います。

コード:

#include <stdio.h>
#include <string.h>

int main(void)
{
	const char *src = "#ABC#hoge#/ABC#";
	const char *beg = src + 0;	// "#ABC#"の位置
	const char *end = src + 9;	// "#/ABC#"の位置
	
	/* beg, end が適切に求まっていると仮定して */
	
	char buf[100];	// 取得先:適当な大きさを確保しておく
	
	// 間の文字列の開始位置
	const char *mid = beg + strlen("#ABC#");
	
	// 間の文字数分だけコピー
	strncpy(buf, mid, end - mid);
	
	// 最後にヌル文字を追加
	buf[end - mid] = '\0';
	
	puts(buf);
	
	return 0;
}


アバター
Ciel
記事: 252
登録日時: 9年前

Re: CかC++でこんな関数ありますか?

#4

投稿記事 by Ciel » 8年前

>>a5ua

ポインタ同士で文字数計算できたんですね。
これでもいけそうですね。
ありがとうございました。

>>へろりさん

これ完璧ですね。ありがとうございました!

解決です!
oui C'est la Vie♪

しひ

Re: CかC++でこんな関数ありますか?

#5

投稿記事 by しひ » 8年前

もう解決しているので蛇足になりますが。

コード:


#include <iostream>
#include <string>

int main()
{
	std::string src = "#ABC##TEST#hoge#/TEST##/ABC#";
	std::string tag = "ABC";
	
	const auto begin = src.find( "#"+tag+"#", 0 ) + tag.length() + 2;
	const auto end = src.find( "#/"+tag+"#", begin );

	if( begin != std::string::npos && end != std::string::npos )
	{
		std::cout << src.substr( begin, end-begin ) << std::endl;
	}

	return 0;
}

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: CかC++でこんな関数ありますか?

#6

投稿記事 by ISLe » 8年前

strtokは与えられた文字列を書き換えてしまいますので、文字列リテラルや共有データを渡す場合に気を付けてください。
Windowsなら文字列リテラル渡しても平気ですが、Linuxだと落ちます。
文字列リテラル渡すような使い方はしないと思いますが。

アバター
Ciel
記事: 252
登録日時: 9年前

Re: CかC++でこんな関数ありますか?

#7

投稿記事 by Ciel » 8年前

しひ さんが書きました:もう解決しているので蛇足になりますが。

コード:


#include <iostream>
#include <string>

int main()
{
	std::string src = "#ABC##TEST#hoge#/TEST##/ABC#";
	std::string tag = "ABC";
	
	const auto begin = src.find( "#"+tag+"#", 0 ) + tag.length() + 2;
	const auto end = src.find( "#/"+tag+"#", begin );

	if( begin != std::string::npos && end != std::string::npos )
	{
		std::cout << src.substr( begin, end-begin ) << std::endl;
	}

	return 0;
}
ありがとうございます!
string型内の関数はあまり使ったことがありませんが、解読して使わせていただきます!
ISLe さんが書きました:strtokは与えられた文字列を書き換えてしまいますので、文字列リテラルや共有データを渡す場合に気を付けてください。
Windowsなら文字列リテラル渡しても平気ですが、Linuxだと落ちます。
文字列リテラル渡すような使い方はしないと思いますが。
サーバから引っ張ってきたHTMLファイルを解析するのが主な処理ですので、
動的確保したバッファのデータを渡すのでたぶん大丈夫です。

文字列リテラル等を渡す場合は十分に気をつけます><
ご忠告ありがとうございました!

では!
oui C'est la Vie♪

閉鎖

“C言語何でも質問掲示板” へ戻る