• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c language)

C言語:ファイル読み込み時に特定の文字列を判定する方法

このQ&Aのポイント
  • C言語でファイルを読み込み、特定の文字列を判定する方法を教えてください。
  • ファイルには、文字列、数字、数字が縦に並んでいます。特定の文字列が「@」だった場合に、処理を行いたいです。
  • 現在はファイルを読み込んで全ての内容を出力するところまでは実装できていますが、特定の文字列を判定する方法がわかりません。

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

  • ベストアンサー
回答No.3

if ( !strcmp(name, "@") { ごめんなない カッコが足りませんでした。 @ 1 10 → ~を実行する @xx 3 11 → ~を実行しない としたいのなら if ( !strcmp(name, "@") ) {  ~ } ですね。 文字の先頭が@というだけで @ 1 10  @xx 3 11 のどちらでも ~を実行していいなら if ( name[0] == '@' ) {  ~ } でよいでしょう。

すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.7

>任意に入力するので無限です。 ならば、任意で入力した文字列を もう一つ別の変数にいれて、 !strcmp(変数A,変数B)で比較ですね。

idontlikeclang
質問者

お礼

thank you

すると、全ての回答が全文表示されます。
回答No.6

>dAAだけを扱いたいのではなく、いろいろな文字列を扱いたいときはどのように読み込みをすればいいのでしょうか? >dAAの部分はたとえば名前を入力するようにたくさんあります。 最初の質問文のようにelseでつなげていけばとりあえずはOKですよ。 ただし、それが、数千になるのか、数個だけなのか?で 作り方は変わると思ってよいかと。 文字列の検索は、まともに検索している関係で、 (同じか?ってのは、検索しているのと同じ動作なので) 作り方により最適なプログラムが違います。 数個なら、今のようにelseでつないでいくだけでOKですよ。

idontlikeclang
質問者

補足

任意に入力するので無限です。

すると、全ての回答が全文表示されます。
回答No.5

>では、'dAA'を扱いたいときはどうすればいいですか? #2さんが回答してくれている通り、 文字ではなく文字列を判定式に使えばOKです。 !strcmp(name,"dAA") が判定式になります。 シングルクオート=文字 ダブルクオート=文字列 に注意!

idontlikeclang
質問者

補足

dAAだけを扱いたいのではなく、いろいろな文字列を扱いたいときはどのように読み込みをすればいいのでしょうか? dAAの部分はたとえば名前を入力するようにたくさんあります。

すると、全ての回答が全文表示されます。
回答No.4

>配列nameは毎回書き換えられので常にname[0]に格納されるということですか? dAA 1 2 B 2 3 @ 23 5 こうなっているのであれば、 1回目は、 name[0]='d';name[1]='A';name[2]='A';name[3]=0; が入ります。 なのでname[n]のnは「何文字目」と理解すればOKです。 2回目は、 name[0]='B';name[1]=0; 3回目は、 name[0]='@';name[1]=0; ですね。 ですので、先頭を参照したいだけなら 何行目でも、name[0]なのです。 (正確には、name[0]=='@'は@で始まるテキストで、@で終わるテキストではありません。) 例えば、@abcなら、abcを出したい!なら、 if (name[0]=='@') { printf("%s",&name[1]); 次の文字の「アドレス」をprintfに渡す。 } 先頭が'@'であることを保証した時点で、2文字目は 文字がなくても0が入っていることは保証される為です。 などでもOKです。 @の時に何かをしたい?が質問なので、 if (name[0]=='@') { この部分が、その何かです。 }

idontlikeclang
質問者

お礼

では、'dAA'を扱いたいときはどうすればいいですか?

すると、全ての回答が全文表示されます。
回答No.2

C言語では 文字列を扱うには、文字の配列を使います 。 ABC 1 2 とある行を while ((del = fscanf(f,"%s %d %d",name,&arr,&leave)) != EOF) { で 読み込んだあとは、 name[0] ←A' name[1] ←'B' name[2] ←'C' name[3] ←'\0' arr ← 1 leave ← 2 でメモリー上に格納されます。 > 文字列の部分が@だったら〜など判定するにはどうすればいいですか? 文字列の先頭文字は、name[0]に入っているので if ( name[0] == '@' ) {  ~; } でもよいですが、これだと 読み込んだ文字列が "@xx"のときも、一致してしまいます。 "@"の1文字のときだけに限定したいなら if ( !strcmp(name, "@") { ~; } ですね。 '@'(シングルクォートで囲んだ文字) でなく "@"(ダブルクォータで囲んだ文字列)で指定する点に注意。   なお1行毎に i++をインクリしてされていますが、 while ((del = fscanf(f,"%s %d %d",name,&arr,&leave)) != EOF) { でname変数は1行ごとに読み込みなおされていて メモリー上に読み込み済の内容を確保している訳ではないので name[i]のように、name変数の配列の位置に使っているのは に誤りでしょう。

すると、全ての回答が全文表示されます。
回答No.1

i++;←こいつに対する初期化がないですね。 fscanfで、ファイルポインタから、新しいデータがname,arr,leave に入るので、先頭で i=0;すべきですが、ロジックの流れ上は、 常に先頭を見ればいいだけになるので、 if(name[i] == '@'){ printf("%s",name); } この判定はname[0]==になりますが、 しかし、ここで判定したために、続くprintfは、"@"になります。 入れる位置としてはここでOKです。 >一応ファイル読み込んで全てプリントしてその後にifで判断しようと思ったのですがうまく行きませんでした。 この原因も先ほど書いた通り fscanfがname,arr,leaveを破壊するためです。

idontlikeclang
質問者

お礼

ちょっとよくわかりません。 すなわちどう書き換えればいいんですか?

idontlikeclang
質問者

補足

配列nameは毎回書き換えられので常にname[0]に格納されるということですか?

すると、全ての回答が全文表示されます。

関連するQ&A