dポイントプレゼントキャンペーン実施中!

全体のソースコード省略させていただきます。
問題のある点だけあげたいと思います。
あるstr型:"初恋の人からの手紙"
その文字列から助詞にあたるものを取得したいとする。
Phrase p_load(Phrase *p, char *str){
....「省略」
str->particle[n] = get_jyoshi(js);//助詞番号取得
1。 printf("助詞:%d,jyoshi:%d\n",
str->particle[n],get_jyoshi(js));

===>>>get_jyoshiの関数はこんな感じです。
int get_jyoshi(char* js){
int num;
if(strcmp(js,"の")==0){
return num = 1;}
if(strcmp(js,"からの")==0){
return num = 2;}
.......「省略」
else
return 0;
}

1。と書いてあるところに助詞の番号を表示しようとしたら助詞番号は"0"、つまりget_jyoshiの関数で文字列比較するときに失敗ということですね。。余談ですが、作ってるソースコードけっこう大きめですいくつかの再利用ソースコードと依存してます。そのため、試しで助詞番号を取得するための簡単な単体プログラムを作りました。そしたら、うまく行きましたが。問題はなんなんでしょうか?さっぱりわからないです。ご教授よろしくお願いします。

A 回答 (8件)

>もしかしたらファイル実体(emacsの方で)がなんらかの文字コードで保存されて、それで文字を比較できない、という可能性もあるんでしょうか?



その可能性もあるような。
strstrだと一致したということですが、strstrの戻り値はポインタです。
つまり、==0で比較すると、不一致の時に、if文を通過します。
そもそも、strstrでも一致していなかったのではないですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 14:40

>結果


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

この回答への補足

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

補足日時:2009/11/17 11:56
    • good
    • 0

えぇと....


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

この回答への補足

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

補足日時:2009/11/17 12:03
    • good
    • 0

文字列からある特定の文字列を検索する、という行為と、


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

この回答への補足

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

補足日時:2009/11/17 12:10
    • good
    • 0

strstrというのは、文字列を検索する関数です。


ですので、
"なにぬねの"
を入力した場合、
"の"
と一致してしまいます。それでもいいのでしょうか?

この回答への補足

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

補足日時:2009/11/16 18:01
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/16 18:21

#2でう。


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

この回答への補足

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

補足日時:2009/11/16 17:46
    • good
    • 0

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

この回答への補足

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

補足日時:2009/11/16 14:30
    • good
    • 0

プログラムを省略するのは構わないけど, 読み取るのに必要な文は残してください. 例えば, str の型は char * だから str->particle[n] は正しくありません. コンパイルエラーになるはずです. また, get_jyoshi に渡している js も宣言が現れていません.


で, だけど, strcmp がどういう関数か理解できてますか? あなたがしたいのは「ある文字列の中から他の文字列を探す」ことであって, 「ある文字列が他の文字列と等しいかどうかを調べる」ことではないのではありませんか? 後者なら strcmp (や strncmp など) ですが, 前者では strstr あたりを使わないとダメですよ.

この回答への補足

一応コンパイルエラーになっていないので省略しました。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にある文字列は等しいであれば助詞であると判断するという処理になっています。説明が下手ですみませんでした。伝わらない部分もあるかと思いますが、よろしくお願いします。

補足日時:2009/11/16 14:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/16 14:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A