• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(C言語)関数の中で文字列比較できない。)

(C言語)関数の中で文字列比較できない

このQ&Aのポイント
  • C言語の関数内で文字列比較ができない問題が発生しています。
  • 特定の文字列から助詞を取得しようとしている際、文字列比較が失敗してしまっています。
  • 助詞の番号を取得するための簡単な単体プログラムではうまく行くのですが、問題が発生しています。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.8

>もしかしたらファイル実体(emacsの方で)がなんらかの文字コードで保存されて、それで文字を比較できない、という可能性もあるんでしょうか? その可能性もあるような。 strstrだと一致したということですが、strstrの戻り値はポインタです。 つまり、==0で比較すると、不一致の時に、if文を通過します。 そもそも、strstrでも一致していなかったのではないですか?

g_loyd
質問者

お礼

長くなってしまってすみませんでした。 やっと解決しました。やはりemacsの文字コードの問題みたいです。 読み込みファイルと今回問題になるソースコードを全部最初から書き換えてみると、正常に動きました。-.-;; お騒がせしました。 ありがとうございました。

その他の回答 (7)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

>結果 >js : の >となるのです。 念のため、ですが、 { char *p=js; printf("["); while(*p){ printf("%02X ",*p++); } printf("]\n"); } だと、どう表示されるでしょうか。これならゴミがあってもわかります。

g_loyd
質問者

補足

アドバイス通りにやってみたら、このように結果が出ました:[FFFFFFA4FFFFFFCE] 言うのを忘れたんですが、このプログラムでファイル操作をやってます(最初から言うべきですね-.-;;)。あるテキストデータのファイルから文字列を読み込んで、処理をやってます。 昨日、思いついて、もしかしたらファイル実体(emacsの方で)がなんらかの文字コードで保存されて、それで文字を比較できない、という可能性もあるんでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

えぇと.... 最初に「プログラムを省略するのは構わないけど」と書いたけどやっぱり撤回. その現象が起きる, 「完全なプログラム」を出してください. 現状だとこちらで推測しなければならないことが多すぎるので, 実際にそのような現象が起きるのか, あるいはここに現れていない何かがおかしいのかを切り分けることができません. 今のままでは「群盲象をなでる」にしかなりません. たとえば, #1 の補足にある関数でもまだコンパイルエラーが出るはずだし, Phrase とかいうものがどのように定義されているのかわかりません.

g_loyd
質問者

補足

すみません、全体のコードをここであげられません。ここで挙げられないほどソースコードが大きいすぎです。はっきり言うと10以上のモジュールがあるので-.-;; 一応前言ってたように、全体をmakeするとコンパイルエラーになってないので、ソースコードは問題ないと思います。このプログラムでファイル操作やってますので、昨日、思いついてもしかしたらオープンするファイルの方に問題があるかもしれないです。(ファイル操作のこと最初から言うべきですね-.-;;;すみません)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.5

文字列からある特定の文字列を検索する、という行為と、 文字列どうしが一致しているかどうかを調べる、という行為が 全く別であることは理解できますね? 今回行ないたいのはどちらですか?strcmp関数を使うことが、目的に合致していますか?

g_loyd
質問者

補足

やりたいのは文字列同士が一致しているかどうかの方です。 そしたらstrcmpですよね。実際、ファイル操作やってますので、昨日思いついて、もしかしたら読み込むファイルのほうに問題があると。。。(ファイル操作のこと最初から言うべきですね-.-;; でも、ご意見ありがとうございます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

strstrというのは、文字列を検索する関数です。 ですので、 "なにぬねの" を入力した場合、 "の" と一致してしまいます。それでもいいのでしょうか?

g_loyd
質問者

お礼

今きづいたんです。やはりstrstrはダメ!!ですね。 get_jyoshiで"までの"、"についての"、"からの"という文字と比較してるので、もし"の"だけきたらこれらの文字と一致すると判定してしまった~~~~~~ (苦戦)なんでstrcmpうまく行かないだろうううう。。。-____-;;;

g_loyd
質問者

補足

本当はstrcmpのほうがいいですが、なぜか今のプログラムでうまくいかないです。ですのでstrstrにしました。もしかしたら、js の値を渡したときに何か見えないゴミが入って渡した"の"という文字を比較できないのでしょうか? でも、このように初期化もちゃんとやってましたが。。。 for(j=0;j<32;j++)js[j]='\0'; strncpy(js, &str[k], i-k); str->particle[n] = get_jyoshi(js)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

#2でう。 >実際表示できたんですが、jsの値は"0"と表示されたんです。 いや、戻り値じゃなくて、引数のほうですよ。

g_loyd
質問者

補足

引数の方はちゃんと文字列が入ってきました。 int get_jyoshi(char* js){ printf("js:%s\n",js); ......「省略」 でやったら 結果 js : の となるのです。 先ほどstrcmpではなくstrstrでやったら、うまくできました。 どうも、すみません。 解答ありがとうございます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

jsの値は表示させてみないのですか?

g_loyd
質問者

補足

実際表示できたんですが、jsの値は"0"と表示されたんです。 実際:"初恋_の_人_から_の_手紙" という文字列を処理して、 単語であるか助詞であるか判断する。 * "初恋" ときたら ==単語 * "の" と きたら ==助詞 しかし、"の"が来る時にget_jyoshiを呼出し、助詞の番号を取得しようとしたら返す値は"0"、つまり"の"は助詞番号がない、しかしget_jyoshiではこのように"の"であれば助詞番号は"1"です。 int get_jyoshi(char* js){ int num; if(strcmp(js,"の")==0){ return num = 1;}

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

プログラムを省略するのは構わないけど, 読み取るのに必要な文は残してください. 例えば, str の型は char * だから str->particle[n] は正しくありません. コンパイルエラーになるはずです. また, get_jyoshi に渡している js も宣言が現れていません. で, だけど, strcmp がどういう関数か理解できてますか? あなたがしたいのは「ある文字列の中から他の文字列を探す」ことであって, 「ある文字列が他の文字列と等しいかどうかを調べる」ことではないのではありませんか? 後者なら strcmp (や strncmp など) ですが, 前者では strstr あたりを使わないとダメですよ.

g_loyd
質問者

お礼

たった今strstrでやってみたらうまく行きました。すみません、ありがとうございました。 別のプログラムでstrcmpを使って、文字列の比較を上のやり方でやったらうまく行ったんですが、なぜでしょうか?strcmpについてもう一度勉強し直したいと思います。ありがとうございます。

g_loyd
質問者

補足

一応コンパイルエラーになっていないので省略しました。m(_ _)m すみませんでした。 実際、処理で使われる文字列はこんな形で:"初恋_の_人_から_の_手紙" Phrase* p(Phrase *str, char *buf){ int i, j, k, n, bun; char t[32],js[32]; /* 文字列の文節の数を数える */ n = 0; bun=0; for (i=0; i<strlen(buf); i++){ if (buf[i] == '_') bun++; } n = bun/2; str->num = n + 1; /* 文字列の単語と助詞の分割処理 */ i=0; k=0; while (buf[i]) { i++; if (buf[i] == '_'){ strncpy(str->basic_gainen[n],&buf[k], i-k); str->basic_gainen[n][i-k] = 0; k=i+1; i++; while(buf[i] != '_') i++; for(j=0;j<32;j++)js[j]='\0'; strncpy(js, &buf[k], i-k); str->particle[n] = get_jyoshi(js);//助詞番号取得 printf("n:%d,jyoshi :%d\n",n,get_jyoshi(js)); k=i+1; n--; } if(n==0){ //次が主部なら while (buf[i]) i++; strncpy(str->basic_gainen[n], &buf[k], i-k); str->basic_gainen[n][i-k] = 0; return c; } } return c; } 上の関数で一応文字列を分割したので、それぞれ、単語であるか助詞であるか処理を行う。分割した文字列をget_jyoshiにある文字列は等しいであれば助詞であると判断するという処理になっています。説明が下手ですみませんでした。伝わらない部分もあるかと思いますが、よろしくお願いします。

関連するQ&A