全体のソースコード省略させていただきます。
問題のある点だけあげたいと思います。
ある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の関数で文字列比較するときに失敗ということですね。。余談ですが、作ってるソースコードけっこう大きめですいくつかの再利用ソースコードと依存してます。そのため、試しで助詞番号を取得するための簡単な単体プログラムを作りました。そしたら、うまく行きましたが。問題はなんなんでしょうか?さっぱりわからないです。ご教授よろしくお願いします。
No.8ベストアンサー
- 回答日時:
>もしかしたらファイル実体(emacsの方で)がなんらかの文字コードで保存されて、それで文字を比較できない、という可能性もあるんでしょうか?
その可能性もあるような。
strstrだと一致したということですが、strstrの戻り値はポインタです。
つまり、==0で比較すると、不一致の時に、if文を通過します。
そもそも、strstrでも一致していなかったのではないですか?
長くなってしまってすみませんでした。
やっと解決しました。やはりemacsの文字コードの問題みたいです。
読み込みファイルと今回問題になるソースコードを全部最初から書き換えてみると、正常に動きました。-.-;;
お騒がせしました。
ありがとうございました。
No.7
- 回答日時:
>結果
>js : の
>となるのです。
念のため、ですが、
{
char *p=js;
printf("[");
while(*p){
printf("%02X ",*p++);
}
printf("]\n");
}
だと、どう表示されるでしょうか。これならゴミがあってもわかります。
この回答への補足
アドバイス通りにやってみたら、このように結果が出ました:[FFFFFFA4FFFFFFCE]
言うのを忘れたんですが、このプログラムでファイル操作をやってます(最初から言うべきですね-.-;;)。あるテキストデータのファイルから文字列を読み込んで、処理をやってます。
昨日、思いついて、もしかしたらファイル実体(emacsの方で)がなんらかの文字コードで保存されて、それで文字を比較できない、という可能性もあるんでしょうか?
No.6
- 回答日時:
えぇと....
最初に「プログラムを省略するのは構わないけど」と書いたけどやっぱり撤回. その現象が起きる, 「完全なプログラム」を出してください. 現状だとこちらで推測しなければならないことが多すぎるので, 実際にそのような現象が起きるのか, あるいはここに現れていない何かがおかしいのかを切り分けることができません. 今のままでは「群盲象をなでる」にしかなりません.
たとえば, #1 の補足にある関数でもまだコンパイルエラーが出るはずだし, Phrase とかいうものがどのように定義されているのかわかりません.
この回答への補足
すみません、全体のコードをここであげられません。ここで挙げられないほどソースコードが大きいすぎです。はっきり言うと10以上のモジュールがあるので-.-;;
一応前言ってたように、全体をmakeするとコンパイルエラーになってないので、ソースコードは問題ないと思います。このプログラムでファイル操作やってますので、昨日、思いついてもしかしたらオープンするファイルの方に問題があるかもしれないです。(ファイル操作のこと最初から言うべきですね-.-;;;すみません)
No.5
- 回答日時:
文字列からある特定の文字列を検索する、という行為と、
文字列どうしが一致しているかどうかを調べる、という行為が
全く別であることは理解できますね?
今回行ないたいのはどちらですか?strcmp関数を使うことが、目的に合致していますか?
この回答への補足
やりたいのは文字列同士が一致しているかどうかの方です。
そしたらstrcmpですよね。実際、ファイル操作やってますので、昨日思いついて、もしかしたら読み込むファイルのほうに問題があると。。。(ファイル操作のこと最初から言うべきですね-.-;;
でも、ご意見ありがとうございます。
No.4
- 回答日時:
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)
今きづいたんです。やはりstrstrはダメ!!ですね。
get_jyoshiで"までの"、"についての"、"からの"という文字と比較してるので、もし"の"だけきたらこれらの文字と一致すると判定してしまった~~~~~~
(苦戦)なんでstrcmpうまく行かないだろうううう。。。-____-;;;
No.2
- 回答日時:
jsの値は表示させてみないのですか?
この回答への補足
実際表示できたんですが、jsの値は"0"と表示されたんです。
実際:"初恋_の_人_から_の_手紙" という文字列を処理して、
単語であるか助詞であるか判断する。
* "初恋" ときたら ==単語
* "の" と きたら ==助詞
しかし、"の"が来る時にget_jyoshiを呼出し、助詞の番号を取得しようとしたら返す値は"0"、つまり"の"は助詞番号がない、しかしget_jyoshiではこのように"の"であれば助詞番号は"1"です。
int get_jyoshi(char* js){
int num;
if(strcmp(js,"の")==0){
return num = 1;}
No.1
- 回答日時:
プログラムを省略するのは構わないけど, 読み取るのに必要な文は残してください. 例えば, 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にある文字列は等しいであれば助詞であると判断するという処理になっています。説明が下手ですみませんでした。伝わらない部分もあるかと思いますが、よろしくお願いします。
たった今strstrでやってみたらうまく行きました。すみません、ありがとうございました。
別のプログラムでstrcmpを使って、文字列の比較を上のやり方でやったらうまく行ったんですが、なぜでしょうか?strcmpについてもう一度勉強し直したいと思います。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 英語 どのような場合に、予定や進行していない動詞を進行形にするかについて 2 2022/03/22 22:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringについて
-
CStringのFindで文字列検索を行...
-
strstrを利用しない文字列検索...
-
sscanfとscanfの違いがよくわか...
-
ブランクのチェック
-
C言語のステップ数をカウントす...
-
charと%c , %s の関係について
-
反転した数値を表示させるやり方
-
Cについて教えてください。
-
(C言語)関数の中で文字列比較で...
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
あと少しなんですが・・・
-
C言語超超初心者です。学校の課...
-
文字列の途中に「0」がある場...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
大学数学の問題です。 加法群Z/...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
fgetsで拾われる改行文字を削除...
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
Cで「大文字、小文字の判定」は...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
小文字のみを数える方法
-
C言語のステップ数をカウントす...
-
C言語でパスワード作成ツール
-
単語数のカウントについて
-
str[j++]の意味
-
fgetsでバッファ残留文字列を無...
-
教えていただけませんか?C言語...
-
エディットボックスに入力され...
おすすめ情報