• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のプログラミングでつまずいてます)

C言語のプログラミングでポインタを使用して文字列を変換する方法

このQ&Aのポイント
  • C言語プログラミングで文字列を変換するために、ポインタを使用する方法について詳しく説明します。
  • string.hとctype.hに含まれる関数を使用せずに、文字列の大文字を小文字に変換する方法を解説します。
  • 提供されたコードのビルドエラーについて、原因を特定し、修正する方法について解説します。

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

試しにコンパイルしてみたところ問題なくコンパイルできましたけど。 ビルドエラーが起こるということですが どういうエラーメッセージが出力されていますか? >C言語に詳しい人でわかるかた、どこがいけないのか、なぜいけないのか、どうすればいいのか詳しくおしえてください。 どこがいけないかで、ひとまずいえることは ・出力されているエラーメッセージを読んでいないこと。

kzmsreo
質問者

お礼

すみません。 なんかウィンドウズでやるとエラーないのにエラー表示されることがあるんです・・・ もう一回コピーしてはりつけたらエラーはありませんでした。 でも思惑通りに動作してませんでした。 大文字小文字のところはもう理解したので大丈夫ですが、ほかがまだなので詳しくかいていただけるとありがたいです。

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

その他の回答 (7)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.8

>scanf("%s", string); >string[NUMOFCHAR] = '\0';//完全に無駄です、この文は削除しましょう。 >printf("Original string is <%s>\n", string); >int i=0; >for(i=0 ; i<NUMOFCHAR+1 ; i++){//バグおよび無駄です、「for(i=0 ; *ptr ; i++){」にしましょう。 >if( *ptr>='A' && *ptr<='Z'){ void print_char(char *ptr){ int i;char *s; for(s=ptr;*ptr;ptr++) for(i=0;i<26;i++) if(*ptr=="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i]){ *ptr=abcdefghijklmnopqrstuvwxyz[i]; break; } printf("%s",s); }

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

if( *ptr>='A' && *ptr<='Z') で「大文字かどうか」を正しく判定できるとは限らないんだけど, そのことは無視していいの?

kzmsreo
質問者

お礼

無視したらだめです… どうしたらいいでしょうか?

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

>どこがいけないのか、なぜいけないのか、どうすればいいのか詳しくおしえてください。 void print_char(char *ptr) で受けて、ptr++ ; のようにポインタを変えておきながら、printf("%s",ptr); として変わってしまっている ptr を出力しているところが大きな誤りです。 int i; を尊重して void print_char(char *ptr) はポインタで受けるのではなく、文字配列 void print_char(char ptr[]) として受けましょう。 void print_char(char ptr[]){ int i; for(i=0 ; ptr[i] != '\0' ; i++){ //ヌルまで繰り返す if( ptr[i]>='A' && ptr[i]<='Z'){ ptr[i] += 'a' - 'A' ; } } printf("%s",ptr); }

kzmsreo
質問者

お礼

ありがとうございます! 書き忘れててすみません 書き換える内容は下記の部分だけでお願いできますか? 参考にしてまた明日やってみますのでお暇があればまたお願いします ありがとうございました { int i=0; for(i=0 ; i<NUMOFCHAR+1 ; i++){ if( *ptr>='A' && *ptr<='Z'){ *ptr += 'A'-'a' ; } ptr++ ; } printf("%s",ptr); }

すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>全然くわしくないので質問もうまくできません。。。 くわしいくわしくないは関係ないと思いますけど。 期待する結果と実際の結果がどう違うのかも説明しきれませんか? >引数の文字列を変換して返す >と >引数の文字列を変換したものを出力 >の違いもよくわかりません。 >結局同じ結果になるようなきがします・・・>< print_char()の処理からすれば同じにはなりませんよ。 前者だと少なくともprintf()で出力することはありませんし 後者だと*ptr += 'A'-'a';のように引数の文字列を書き換える必要はありません。 前者と後者の違いが具体的にわからないのであれば main()内のprint_char(string);のあとにprintf("%s", string);をいれてみてください。 出力するだけのprint_char()が、stringの内容を書き換えている(変換したものを返している)のが確認できると思います。

kzmsreo
質問者

お礼

前者だと少なくともprintf()で出力することはありませんし→returnを使うということですか?(どのように使うかわからなくてprintfでも同じかと思ったのでprintfつかいました) 後者だと*ptr += 'A'-'a';のように引数の文字列を書き換える必要はありません。→ではどうするのですか??全然わかってなくてすみません… main()内のprint_char(string);のあとにprintf("%s", string);をいれてみてください。 出力するだけのprint_char()が、stringの内容を書き換えている(変換したものを返している)のが確認できると思います。 →やってみます また明日やってみますのでよければ明日もお願いします 何度も回答ありがとうございます

すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>でも思惑通りに動作してませんでした。 >大文字小文字のところはもう理解したので大丈夫ですが、ほかがまだなので詳しくかいていただけるとありがたいです。 あなたが思われている「ほか」とは何でしょうか? 私が思うとこの「ほか」をあげると動作結果とは直接関係のない とこまで及んでしまいますけど。 どういう事か、あえて1点あげるなら ・print_char()は「引数の文字列を変換して返す」 「引数の文字列を変換したものを出力」どちらが目的ですか? 関数名からするとprint_char()は後者の出力するのが目的だと思いますが、 実際のコードは引数の文字列そのものを加工してしまっているので、 前者と後者2つの目的を持つことになってしまってます。

kzmsreo
質問者

お礼

すみません 全然くわしくないので質問もうまくできません。。。 引数の文字列を変換して返す と 引数の文字列を変換したものを出力 の違いもよくわかりません。 結局同じ結果になるようなきがします・・・>< 具体的にどうちがってくるのでしょうか・・・; 違うのなら目的は後者だとおもいます。 プログラムをどうかきかえればうまくいくのでしょうか??><

すると、全ての回答が全文表示されます。
  • not_ace
  • ベストアンサー率52% (35/67)
回答No.3

ビルド自体は通ると思うのですが・・・どうなんでしょう? プログラムが上に張られたものそのものならビルドは通りますが、 意図通りの動作はしないと思われます。 以下要修正点 大文字と小文字の大きさは逆です。 誤:*ptr += 'A'-'a' ; 正:*ptr += 'a'-'A' ; printf("%s",ptr); for文のなかでptrを直接書き換えているので文字列の末尾を printfが参照しようとします。 for文で回す前にptrの値を別の変数に保存するなりしましょう。

kzmsreo
質問者

お礼

ありがとうございます^^ 前半は理解しました。 for(i=0 ; i<NUMOFCHAR+1 ; i++){ if( *ptr>='A' && *ptr<='Z'){ *ptr += 'A'-'a' ; } ptr++ ; } printf("%s",ptr); } こうはんですが、ptr++で文字列の最後までいくからそれをプリントしてしまうということですよね。 ptr++がないとptrの最初の文字をさすことになりますよね?。 ということは、ptrを置き換えなくても最後のprintf("%s",ptr);を1つ上の中かっこ{}のなかにいれればいけますか? あと初歩的で申し訳ないのですが、このptrというのはデータ・アドレスでいうとアドレスをさしていますよね? なぜ最後のprintf("%s",ptr);はprintf("%s",*ptr);にならないのでしょうか?*ptrはデータなので配列のなかみを表示するとかんがえているのですが・・・

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

まずは、その「ビルドエラー」のメッセージを読むこと。 プロフェッショナルでも、そこから始めます。 質問するにしても、エラーメッセージがあるのと無いのとでは、回答する手間が段違いです。 もっとも、このプログラムを実際やってみたところ「ビルドエラー」にはなりません。 実行自体は正常に終わって、結果が期待通りでない、ということになりそうです。 実行時のエラーになる可能性はあります。 > *ptr += 'A'-'a' ; x+=y;は x = x+y ;です。なので *ptr = *ptr + ('A'-'a'); です。*ptr='A'だった場合、この計算がいくつになると思いますか?上の式から括弧をはずしてみましょう。 下から2行目 > printf("%s",ptr); このときにポインタptrがどこを指しているか、よく考えてください > printf("Modified string is <"); > print_char(string); > printf(">\n"); を printf("Modified string is <"); print_char(string); printf(">\n"); printf("Modified string(2) is <%s>". string); とすると、ヒントになるかもしれません

kzmsreo
質問者

お礼

ありがとうございます。 前半は理解しました。 でも、後半がいまいちよくわかりません。 教科書は何度もよんでるのですが、ポインタについてあまりつかみきれてないので・・・ ptrはアドレスを、*ptrはデータをさしているなど、どれがデータどれがアドレスかはわかるのですが・・・

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

関連するQ&A