- 締切済み
C言語の変換する関数について教えてください。
キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する。 #include <ctype.h> #include <stdio.h> void name_toupper(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = toupper(istr[i]); i++; } } void name_tolower(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = tolower(istr[i]); i++; } } void name_change(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { if(isupper(istr[i])) { ostr[i] = toupper(istr[i]); } else { ostr[i] = tolower(istr[i]); } i++; } } int main(void) { char buffer[100]; printf("文字"); gets(buffer); name_toupper(buffer); printf("大文字: %s\n", buffer); name_tolower(buffer); printf("小文字: %s\n", buffer); name_change(buffer); printf("大小交換: %s\n", buffer); return 0; } 上のプログラムでは、呼び出し時のパラメータが足りないとエラーが発生してしまいます。文字列を入れておく配列をbuffer以外にもう一つ作らなくてはいけないと思うのですが、うまくいきません。 教えてください。よろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8801/19960)
>上のように変えましたが出力結果が下のようになってしまいます。 >文字abc DEFG >大文字: ABC DEFGゥヲ・・・Tユ、v >小文字: abc defgゥヲ・・・Tユ、v >大小交換: abc DEFGゥヲ・・・Tユ、v >なぜだが分かりません。 大文字に変換する時、小文字に変換する時、大文字小文字を逆にする時、あなたは while (istr[i]) ってやってます。 これ、意味判ってやってますか? これは「istr[i]が0になったら文字列の終りだから、そこでヤメ」って事ですよね? つまり「文字列の終りは、文字が0になってる」のですね。 で、あなた、resultに「変換した文字」を入れたは良いけど「文字列の終りを示す0」は入れてますか? char result[100]; っってのは「100文字分の場所は取ったけど、中身はどうなってるか知らないよ」って宣言です。 あなたが「resultの先頭から、ABC DEFGと入れた」ら、その後ろは「ゴミ」です。 文字列の終りのマークの0を入れてないので、resultを表示したら、後ろのゴミも一緒に表示されます。 ここまで書いたら、どこをどう直せば良いか、もう判りますね。 もし判らないなら、以下の2つのプログラムを実行して、結果を比べてみましょう。 プログラム1 #include <stdio.h> int main(void) { char buffer[100]; char result[100]; result[0] = 'A'; result[1] = 'B'; result[2] = 'C'; result[3] = 'D'; printf("文字列: %s\n", result); return 0; } プログラム2 #include <stdio.h> int main(void) { char buffer[100]; char result[100]; result[0] = 'A'; result[1] = 'B'; result[2] = 'C'; result[3] = 'D'; result[4] = '\0'; // result[4] = 0;と同じ printf("文字列: %s\n", result); return 0; } 結果は プログラム1 文字列: ABCD=k裳ゥヲ・・・Tユ、v (「=k裳ゥヲ・・・Tユ、v」の部分は上記と違うかも知れない) プログラム2 文字列: ABCD となった筈。
再びNo.6です。 すいません、補足のソースを見間違えました。No.7の回答は忘れてください。 とりあえず、動作が怪しい name_change() について toupper() の前に、 printf( " istr[%d]:%c, ostr[%d]:%c\n", i, istr[i], i, ostr[i] ); toupper() の後に、 printf( " => istr[%d]:%c, ostr[%d]:%c\n", i, istr[i], i, ostr[i] ); を入れてみてください。思っていた動作になりましたか?
No.6です。 No.5さんの言いたい事を解りやすく言うと以下の通りです。 result さんが“なぜ、俺を出さない!”と思っています。
こんにちは。 関数に通す前にresultを初期化しておいてください。 ゴミが詰まってます。 ご参考までに。
- tatsu99
- ベストアンサー率52% (391/751)
>name_toupper(buffer,result); >printf("大文字: %s\n", buffer); >name_tolower(buffer,result); >printf("小文字: %s\n", buffer); >name_change(buffer,result); >printf("大小交換: %s\n", buffer); 変換を行った結果がresultに出力されるので、 印字すべきは、resultの内容では内でしょうか。
補足
申し訳ございません。 うまく理解できないので詳しく教えてもらえませんか? よろしくお願いします。
- chie65536(@chie65535)
- ベストアンサー率44% (8801/19960)
当方の回答が意味不明ですね。 「この6行」じゃなく「下記の6行」ですね。
- chie65536(@chie65535)
- ベストアンサー率44% (8801/19960)
>上のようにプログラムを変更したところコンパイルではエラーが出ないのですが、出力結果が下のようになってしまいます。 この6行だけ「じっ~~~~~」っと見ましょう。穴が開くほど見ましょう。モニタが焼け付くくらい見ましょう。 そして「自分が何を表示させようとしているのか?」に思いを馳せましょう。 そして「自分が表示したいのは何か?」にも思いを馳せましょう。 すべての原因は以下の部分にあります。 name_toupper(buffer,result); printf("大文字: %s\n", buffer); name_tolower(buffer,result); printf("小文字: %s\n", buffer); name_change(buffer,result); printf("大小交換: %s\n", buffer); もっと言えば、以下の3行にあります。 printf("大文字: %s\n", buffer); printf("小文字: %s\n", buffer); printf("大小交換: %s\n", buffer); それでも判らない場合は「選択授業にC言語を選んじゃったのを後悔する」しかありません。たぶん、貴方にC言語は向いてません。
補足
#include <ctype.h> #include <stdio.h> void name_toupper(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = toupper(istr[i]); i++; } } void name_tolower(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = tolower(istr[i]); i++; } } void name_change(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { if(isupper(istr[i])) { ostr[i] = toupper(istr[i]); } else { ostr[i] = tolower(istr[i]); } i++; } } int main(void) { char buffer[100]; char result[100]; printf("文字"); gets(buffer); name_toupper(buffer,result); printf("大文字: %s\n", result); name_tolower(buffer,result); printf("小文字: %s\n", result); name_change(buffer,result); printf("大小交換: %s\n", result); return 0; } 上のように変えましたが出力結果が下のようになってしまいます。 文字abc DEFG 大文字: ABC DEFGゥヲ・・・Tユ、v 小文字: abc defgゥヲ・・・Tユ、v 大小交換: abc DEFGゥヲ・・・Tユ、v なぜだが分かりません。 教えてもらえませんか。よろしくお願いします。
- arain
- ベストアンサー率27% (292/1049)
No.1です はじめに、きついことを書くことを宣言しておきます。 甘ったれるな! 質問に >上のプログラムでは、呼び出し時のパラメータが足りないとエラーが発生してしまいます。 とあるから、エラーが発生する理由も書いてある。 >エラー発生行だけをなおすだけじゃいけないというところまでしか分かりません。 そもそも、これは関数に合わせて引数を直しての発言か? 修正したのなら、そのソースを提示してから言え! 提示もなしに「なおすだけじゃいけない」なんてことは言えない。 エラー行を直せば、ひょっとしたら動くかもしれない。 動かないなら、どう動かない(もしくは正しくならない)かは書けるはず。 上記はそれすら放棄した発言ととる。 「分からないから質問する」これは誰しもあること。 但し、その際にあったアドバイスがどれだけ次に生きてくるかが問題。 すでに何度かの質問で様々な質問の仕方についてもアドバイスされている。 それが一切に生きていない。
補足
申し訳ございません。 #include <ctype.h> #include <stdio.h> void name_toupper(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = toupper(istr[i]); i++; } } void name_tolower(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = tolower(istr[i]); i++; } } void name_change(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { if(isupper(istr[i])) { ostr[i] = toupper(istr[i]); } else { ostr[i] = tolower(istr[i]); } i++; } } int main(void) { char buffer[100]; char result[100]; printf("文字"); gets(buffer); name_toupper(buffer,result); printf("大文字: %s\n", buffer); name_tolower(buffer,result); printf("小文字: %s\n", buffer); name_change(buffer,result); printf("大小交換: %s\n", buffer); return 0; } 上のようにプログラムを変更したところコンパイルではエラーが出ないのですが、出力結果が下のようになってしまいます。 文字ABC defg 大文字: ABC defg 小文字: ABC defg 大小交換: ABC defg どうすれば、正しいプログラムになるか分かりません。 教えてください。
- arain
- ベストアンサー率27% (292/1049)
>上のプログラムでは、呼び出し時のパラメータが足りないとエラーが発生してしまいます。 エラーメッセージと一緒に、エラーの発生行が表示されるはずです。 その出ている場所をよく確認してください。 今回の場合は、関数宣言では引数が「二つ」なのに、呼び出しでは引数が「一つ」しかないからです。 だからパラメーターが「足りない」となります。
補足
エラー発生行だけをなおすだけじゃいけないというところまでしか分かりません。 どうすればよいのか具体的に教えてもらえませんか? よろしくお願いします。
補足
name_toupper(buffer,result); printf("大文字: %s\n", result); name_tolower(buffer,result); printf("小文字: %s\n", result); name_change(buffer,result); printf("大小交換: %s\n", result); にしてもダメでした。 出すとはどこにですか? よろしくお願いします。