いろいろなケースで「文字列から特定の部分だけ切り出して変数へ入れたい」と思うことが多いのですが、
sscanfでは空白や改行が勝手に区切りとして扱われていて使い勝手が悪いです。
sprintfの挙動の正反対というか、フォーマットにしたがって切り出してくれるような関数はあるでしょうか?
改行や空白を置き換えてsscanfに渡すようなラッパも考えたのですが、
やはり置き換えた文字列が出てくる可能性もありえなくないので、完全なものになりませんでした。
抽象的な質問ですみません。
文字列の切り出しに便利な関数はありますか
Re: 文字列の切り出しに便利な関数はありますか
最も強力なのは正規表現だと思います。
速度は遅いですが、かなり複雑なパターンでも切り出すことができます。
ただし、C++11でないと標準ライブラリにはないので適当なものを探してくる必要があります。
速度は遅いですが、かなり複雑なパターンでも切り出すことができます。
ただし、C++11でないと標準ライブラリにはないので適当なものを探してくる必要があります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 文字列の切り出しに便利な関数はありますか
C言語の範囲でやるとすればstrtokで切り出して数値チェックや文字→数値変換は自前ってのがよくあるパターンだと思います。
プロでscanf系を使っているのはほとんど見たことがありません。
プロでscanf系を使っているのはほとんど見たことがありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 文字列の切り出しに便利な関数はありますか
ご回答ありがとうございます。
やっぱりなさそうですね・・・・
>h2so5さん
ほかの言語に正規表現があるのをみるとうらやましくなってしまいます・・・・
Cでもいけるライブラリを探してみようと思います。
>softyaさん
やっぱりscanf系は使いにくいのですね。
strtokはちょっと怖いので自前でポインタをいじる方向でやってみようと思います。
ありがとうございました。
いちおうこれで解決とさせていただきます。
やっぱりなさそうですね・・・・
>h2so5さん
ほかの言語に正規表現があるのをみるとうらやましくなってしまいます・・・・
Cでもいけるライブラリを探してみようと思います。
>softyaさん
やっぱりscanf系は使いにくいのですね。
strtokはちょっと怖いので自前でポインタをいじる方向でやってみようと思います。
ありがとうございました。
いちおうこれで解決とさせていただきます。
Re: 文字列の切り出しに便利な関数はありますか
何が怖いのでしょうか?バグが報告されていたのでしょうか?shiro4ao さんが書きました: strtokはちょっと怖いので
使いにくいので・・とかならわからないでもないですが。
non
Re: 文字列の切り出しに便利な関数はありますか
(プロ『が』ではなく)プロでsscanf系を使わないのは、sscanfの仕様の問題ではなく、そもそも処理系がsscanfを実装していないとか実行形式のサイズが大きくなるのを嫌うのが原因だと思います。
少なくとも、空白や改行が『勝手に』区切りとして扱われることはないと思いますが。
これを実行すると
[a b]
と表示されます。
少なくとも、空白や改行が『勝手に』区切りとして扱われることはないと思いますが。
#include <stdio.h>
int main(void)
{
char sz[] = "a b,c";
char buf[32];
sscanf(sz, "%[^,]", buf);
printf("[%s]\n", buf);
return 0;
}
[a b]
と表示されます。
Re: 文字列の切り出しに便利な関数はありますか
ご回答ありがとうございます。
文字列処理は根深い問題というか難しい問題の1つなんだなあという印象です
>nonさん
マルチスレッドのことを考えた場合、
strtokが「もともとの文字列が壊される」「スレッドセーフではない」の2点が気になって
恐ろしいと思いました。
前者は「あらかじめコピーしておく」ことで回避できますが、後者はなんとも難しそうで・・・
>ISLeさん
処理系がsscanfを積んでいないこともあるんですね・・・
アマの自分から見ればすごい世界です・・・・・
(グラフィックドライバを作っていた友人が「(プラットフォームの制限で)二次元配列が使えなくて困った」といっていたのを思い出します)
%[^,]って「コンマまではヒトカタマリとみる」という意味だったと記憶していますがそんな使い方もあるのですね・・・・
sprintfのようにできる限り直感的な挙動にしたいので、
やはりゼロから作ってしまうほうがいい気がしてきました。
可変長引数の扱いを勉強しないといけないので、
とりあえず、今、つくっているソフト(質問とは別件)を片付けてからやってみようと思います。
いろいろとすみません、ありがとうございます。
文字列処理は根深い問題というか難しい問題の1つなんだなあという印象です
>nonさん
マルチスレッドのことを考えた場合、
strtokが「もともとの文字列が壊される」「スレッドセーフではない」の2点が気になって
恐ろしいと思いました。
前者は「あらかじめコピーしておく」ことで回避できますが、後者はなんとも難しそうで・・・
>ISLeさん
処理系がsscanfを積んでいないこともあるんですね・・・
アマの自分から見ればすごい世界です・・・・・
(グラフィックドライバを作っていた友人が「(プラットフォームの制限で)二次元配列が使えなくて困った」といっていたのを思い出します)
%[^,]って「コンマまではヒトカタマリとみる」という意味だったと記憶していますがそんな使い方もあるのですね・・・・
sprintfのようにできる限り直感的な挙動にしたいので、
やはりゼロから作ってしまうほうがいい気がしてきました。
可変長引数の扱いを勉強しないといけないので、
とりあえず、今、つくっているソフト(質問とは別件)を片付けてからやってみようと思います。
いろいろとすみません、ありがとうございます。
Re: 文字列の切り出しに便利な関数はありますか
%[abc]はa,b,cの文字だけで構成された文字列shiro4ao さんが書きました:%[^,]って「コンマまではヒトカタマリとみる」という意味だったと記憶していますがそんな使い方もあるのですね・・・・
%[^abc]はa,b,c以外の文字だけで構成された文字列
という意味です。