お世話になります。
超くだらない質問なんですが、
あるポインタから、あるポインタまでの文字を取得できるって関数ありますか?
例えば、
#ABC#あいうえおかきくけこ#/ABC#
という文字列がバッファにあったとして、
#ABC#と#/ABC#はstrstr等でその位置を取得できますが、
その間の文字である、「あいうえおかきくけこ」を取得したいんです。
当然この中の文字は可変です。文字数も変わりますし、どんな文字が入るのかも分かりません。
前後のポインタさえ取得できれば、その間の文字を取得できるような関数があればなーと思ってるんですが、
そんな関数ありますでしょうか?
なければ、他の方法でも良いです。
何も無ければ自分で何とかします。
よろしくお願いします。
CかC++でこんな関数ありますか?
Re: CかC++でこんな関数ありますか?
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;
}
Re: CかC++でこんな関数ありますか?
>>a5ua
ポインタ同士で文字数計算できたんですね。
これでもいけそうですね。
ありがとうございました。
>>へろりさん
これ完璧ですね。ありがとうございました!
解決です!
ポインタ同士で文字数計算できたんですね。
これでもいけそうですね。
ありがとうございました。
>>へろりさん
これ完璧ですね。ありがとうございました!
解決です!
oui C'est la Vie♪
Re: CかC++でこんな関数ありますか?
もう解決しているので蛇足になりますが。
#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;
}
Re: CかC++でこんな関数ありますか?
strtokは与えられた文字列を書き換えてしまいますので、文字列リテラルや共有データを渡す場合に気を付けてください。
Windowsなら文字列リテラル渡しても平気ですが、Linuxだと落ちます。
文字列リテラル渡すような使い方はしないと思いますが。
Windowsなら文字列リテラル渡しても平気ですが、Linuxだと落ちます。
文字列リテラル渡すような使い方はしないと思いますが。
Re: CかC++でこんな関数ありますか?
ありがとうございます!しひ さんが書きました:もう解決しているので蛇足になりますが。#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型内の関数はあまり使ったことがありませんが、解読して使わせていただきます!
サーバから引っ張ってきたHTMLファイルを解析するのが主な処理ですので、ISLe さんが書きました:strtokは与えられた文字列を書き換えてしまいますので、文字列リテラルや共有データを渡す場合に気を付けてください。
Windowsなら文字列リテラル渡しても平気ですが、Linuxだと落ちます。
文字列リテラル渡すような使い方はしないと思いますが。
動的確保したバッファのデータを渡すのでたぶん大丈夫です。
文字列リテラル等を渡す場合は十分に気をつけます><
ご忠告ありがとうございました!
では!
oui C'est la Vie♪