文字列の切り出しに便利な関数はありますか

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

文字列の切り出しに便利な関数はありますか

#1

投稿記事 by shiro4ao » 11年前

いろいろなケースで「文字列から特定の部分だけ切り出して変数へ入れたい」と思うことが多いのですが、
sscanfでは空白や改行が勝手に区切りとして扱われていて使い勝手が悪いです。
sprintfの挙動の正反対というか、フォーマットにしたがって切り出してくれるような関数はあるでしょうか?

改行や空白を置き換えてsscanfに渡すようなラッパも考えたのですが、
やはり置き換えた文字列が出てくる可能性もありえなくないので、完全なものになりませんでした。

抽象的な質問ですみません。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 文字列の切り出しに便利な関数はありますか

#2

投稿記事 by h2so5 » 11年前

最も強力なのは正規表現だと思います。
速度は遅いですが、かなり複雑なパターンでも切り出すことができます。

ただし、C++11でないと標準ライブラリにはないので適当なものを探してくる必要があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字列の切り出しに便利な関数はありますか

#3

投稿記事 by softya(ソフト屋) » 11年前

C言語の範囲でやるとすればstrtokで切り出して数値チェックや文字→数値変換は自前ってのがよくあるパターンだと思います。
プロでscanf系を使っているのはほとんど見たことがありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 文字列の切り出しに便利な関数はありますか

#4

投稿記事 by shiro4ao » 11年前

ご回答ありがとうございます。
やっぱりなさそうですね・・・・

>h2so5さん
ほかの言語に正規表現があるのをみるとうらやましくなってしまいます・・・・
Cでもいけるライブラリを探してみようと思います。

>softyaさん
やっぱりscanf系は使いにくいのですね。
strtokはちょっと怖いので自前でポインタをいじる方向でやってみようと思います。

ありがとうございました。
いちおうこれで解決とさせていただきます。

non
記事: 1097
登録日時: 13年前

Re: 文字列の切り出しに便利な関数はありますか

#5

投稿記事 by non » 11年前

shiro4ao さんが書きました: strtokはちょっと怖いので
何が怖いのでしょうか?バグが報告されていたのでしょうか?
使いにくいので・・とかならわからないでもないですが。
non

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 文字列の切り出しに便利な関数はありますか

#6

投稿記事 by ISLe » 11年前

(プロ『が』ではなく)プロでsscanf系を使わないのは、sscanfの仕様の問題ではなく、そもそも処理系がsscanfを実装していないとか実行形式のサイズが大きくなるのを嫌うのが原因だと思います。

少なくとも、空白や改行が『勝手に』区切りとして扱われることはないと思いますが。

コード:

#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]
と表示されます。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 文字列の切り出しに便利な関数はありますか

#7

投稿記事 by shiro4ao » 11年前

ご回答ありがとうございます。
文字列処理は根深い問題というか難しい問題の1つなんだなあという印象です

>nonさん
マルチスレッドのことを考えた場合、
strtokが「もともとの文字列が壊される」「スレッドセーフではない」の2点が気になって
恐ろしいと思いました。
前者は「あらかじめコピーしておく」ことで回避できますが、後者はなんとも難しそうで・・・

>ISLeさん
処理系がsscanfを積んでいないこともあるんですね・・・
アマの自分から見ればすごい世界です・・・・・
(グラフィックドライバを作っていた友人が「(プラットフォームの制限で)二次元配列が使えなくて困った」といっていたのを思い出します)
%[^,]って「コンマまではヒトカタマリとみる」という意味だったと記憶していますがそんな使い方もあるのですね・・・・


sprintfのようにできる限り直感的な挙動にしたいので、
やはりゼロから作ってしまうほうがいい気がしてきました。
可変長引数の扱いを勉強しないといけないので、
とりあえず、今、つくっているソフト(質問とは別件)を片付けてからやってみようと思います。
いろいろとすみません、ありがとうございます。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 文字列の切り出しに便利な関数はありますか

#8

投稿記事 by ISLe » 11年前

shiro4ao さんが書きました:%[^,]って「コンマまではヒトカタマリとみる」という意味だったと記憶していますがそんな使い方もあるのですね・・・・
%[abc]はa,b,cの文字だけで構成された文字列
%[^abc]はa,b,c以外の文字だけで構成された文字列
という意味です。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 文字列の切り出しに便利な関数はありますか

#9

投稿記事 by shiro4ao » 11年前

なるほど、誤解して覚えていました。
ありがとうございます。

閉鎖

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