• 締切済み

ポインタ

字列2つを入力し,同じ文字列かどうかを判定するプログラム ポインタの操作で文字列の比較を実現する。 (ライブラリ関数 strcmp を仕様しない) 関数の中身が上手に実現出来ません。 文字列を指すポインタ変数 2 つを引数に取り,同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す関数 必ず,具体的な解答を提示して下さい。 char str__com(char *s,char *t,int count) { while(*s = *t != '\0'){ if(s != t){ return -1; } if(s == t){ count++; } {s++;t++;} } return -1; }

みんなの回答

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

ついでにいうと #2 の charは「-128~-1、0~127」しか表現できない も一般的には間違っています. char が符号付きか符号なしかは処理系に依存するので今のように処理系が分からない場合には決められないし, char の大きさについても「8ビット以上」と決められているだけ. とはいえ確かに char を返すのはおかしいよなぁ. ・同じ文字列なら -1 を返すというのが意味不明 ・なんで引数に count があるんだろう など, 仕様としてもおかしいけど.

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#1の方の下記の文章は >>必ず,具体的な解答を提示して下さい。 >「具体的な」が「ソースを全部修正した回答」を期待していて、 >なおかつ「学校の課題」に対してそれをやったら丸投げ。 となっていますが、 これは、丸投げが禁止であるとは、言っていません。 質問者のこのような行為が丸投げに該当すると言っているだけです。 従って、全く正しい回答です。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.3

>#2 >while(*s = *t != '\0'){ これは「tが指す場所の文字を、sが指す場所に代入して、代入した値が'\0'かどうか?」って処理なんだけど、理解してる? は間違い #1の方のアドバイスが正しい。 嘘を教えてはいけません。

回答No.2

>char str__com(char *s,char *t,int count) charは「-128~-1、0~127」しか表現できないけど?一致した文字数が128文字とか、255文字だったらどうなるか、理解してる? >while(*s = *t != '\0'){ これは「tが指す場所の文字を、sが指す場所に代入して、代入した値が'\0'かどうか?」って処理なんだけど、理解してる? つまり「1番目の引数で渡した文字列が、2番目の引数で渡した文字列にコピーされる」んだけど? >if(s != t){ >if(s == t){ これは「文字列の中身じゃなくて、アドレスを比較してる」って処理なんだけど、理解してる? >count++; 「関数に渡されてきた引数は、呼び出し元で渡した変数のコピーなので、関数を抜ける寸前に消滅する」んだけど、理解してる? どうみても「わけもわからず、誰か他人が作った関数を、そのままコピペして質問してる」としか思えない。 もしこれが学校の課題なのなら、基本が全然ダメなんで、初学年の初学期からやり直した方が良いと思う。 >ANo.1 >なおかつ「学校の課題」に対してそれをやったら丸投げ。 「丸投げ」は禁止事項から外されたので何の問題もないけど? 新しい「禁止事項」と「サイトからのお知らせ」ちゃんと読んでますか? 回答者であっても「禁止事項」と「お知らせ」くらいは目を通すべきです。 (って感じで他人に指摘するのも禁止事項なんだけど、世の中「禁止されてると判ってても、書かなきゃ気付いてもらえない」から困ったもんだ。自分で気付くまで待ってるほど気が長い訳じゃないし)

回答No.1

>必ず,具体的な解答を提示して下さい。 「具体的な」が「ソースを全部修正した回答」を期待していて、 なおかつ「学校の課題」に対してそれをやったら丸投げ。 >同じ文字列なら -1 を,異なる場合は先頭から一致した文字数 を返す 同じでも、違っても戻り値としては「-1」しか返していない。 文字数を返す(と思われる)countは「値渡し」なので、文字数を返せない。「参照渡し」に変更する必要がある。(もしくは、戻り値で返す?) >while(*s = *t != '\0'){ は、処理の優先順位を示すと while(*s = (*t != '\0')) となる。 *tが'\0'と一致しているか同課の比較結果である「真/偽」を*sの指し示す場所に代入している処理になるため、条件としては間違い。 文字列の終端は'\0'なので、どちらか一方が終端になったらおしまい。 「*sが'\0'でなく」かつ「*tが'\0'でない」間の間処理する必要がある。 >if(s != t){ >if(s == t){ はsとtそれぞれの「アドレス」を比較している、比較する内容は「アドレスの指し示す内容」のため間違い。

関連するQ&A