OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

文字列の比較について

  • すぐに回答を!
  • 質問No.245296
  • 閲覧数47
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 66% (22/33)

C++で勉強しているのですが、

下のような内容のファイルをつくり、プログラムで
左辺を検索して右辺の数字を読み込むには
どうしたらよいでしょうか?

ただし、1字1字の検索ではなく3文字なら3文字を
検索して右辺の数字を読み込むようにするような簡潔な
プログラミングを望んでます。
(1文字ごとの検索なら簡単にできるのですが
めちゃくちゃ汚いソースになったので完結にしたいのです。)
-----------------------File Start
opt = 1;      オプション番号
temp = 2;      テンポラリ位置
link =3;       リンカー場所
data=4;       データの種類
hoehoe = 5;    ほえほえの種類
-----------------------File END

例:
dataという文字を探してその文字の右辺を読み取りたいのです。
セミコロンより右は読まないようにしたいのです。

宜しくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル9

ベストアンサー率 30% (18/60)

Cの標準ライブラリ関数だけで書きたいのですか?

こういう処理は、誰でもすること&低レベルな(細かい)処理なので、ホントなら「自作」してはいけません。

記憶があまり定かでないのですが、
Windowsの環境でしたら GetProfileString、GetProfileStringIng, etc... が使えますし、C++のクラスライブラリにも適当なものが見つかるはずです。
(Javaなんかだと、言語標準でクラスが用意されてます。Properties)


もしC標準ライブラリだけで自作するのであれば、下のヒントに書いた文字列操作関数を使うと便利だと思います(コンパイラがないので、ちゃんと動くコードをかけなくて残念ですが・・)。

   char* strtok(const char*, const char*);
   文字列をトークン(特定の文字により区切られる最小の要素)に分割する。

   int strncmp(const char*, const char*, int);
文字列同士を先頭からNバイト比較する


こういう関数を作成するなら「部品」として再利用したいですよね。

ガリガリと書いた挙句に、汎用性を欠く仕様(左辺がかならず行の最初から始まっていないと×、左辺と=、=と右辺の間にスペースが1つでないと×など・・)にならないよう気をつけてください。たとえば行の先頭が「;] (line[0] == ';')
なら、注釈行として読み飛ばすなどの考慮があったほうがベターです。

標準ライブラリ関数も使わない・・なんてのは論外ですよ(笑)。。
補足コメント
tb4104

お礼率 66% (22/33)

すみません。情報が少なかったかも知れません。
とりあえず、DOS上でつかうもので、
また、相手のファイル(質問で出しましたデータSample)が
どういう状況ではき出されているのか仕様が全く見えないもので、
分割していく方法しかないのですか。

わたしが考えていたのは、ラインを読み込み
スペースを削除し、そして「;」以上は掃き捨てにし、
(ここまではできておるのですが)その後、
検索文字と比較しようとしていたのです。

これよりもいい操作があればと思っていたのですが・・・・

strtokを使うということには思いつきませんでした。
ありがとうございます。参考にさせていただきます。
投稿日時 - 2002-04-02 00:40:26
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2
レベル13

ベストアンサー率 34% (574/1662)

きちんとやる場合でなく、簡単に書く場合を・・・。 while(gets(line)) { n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment); if ( n >= 2 && !strcmp(name,"data") { } } まあ、ge ...続きを読む
きちんとやる場合でなく、簡単に書く場合を・・・。


while(gets(line)) {
n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment);
if ( n >= 2 && !strcmp(name,"data") {

}
}

まあ、gets()なんて使うとバッファオーバーフロー攻撃を受けるとか,
エラーチェックが手抜きとか、そういう問題はありますし、
その上、思いついたのを書き下ろしただけで、
コンパイルはおろか、ちゃんと動くかもわかりません(^^;;;;


でも、私が使い捨てレベルのプログラムを書くときにはよく使ってます。
お礼コメント
tb4104

お礼率 66% (22/33)

ありがとうございました。
結局、自分でポインタごとに比較してやりました。
自分で作るのは難しいですね。
投稿日時 - 2002-04-26 21:04:43


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ