• 締切済み

C言語の変換する関数について教えてください。

キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する #include <ctype.h> #include <stdio.h> void name_toupper(char str[]) { unsigned i = 0; while (str[i]) { str[i] = toupper(str[i]); i++; } } void name_tolower(char str[]) { unsigned i = 0; while (str[i]) { str[i] = tolower(str[i]); i++; } } int main(void) { char str[100]; printf("文字"); scanf("%s", str); name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); return 0; } 自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 あと(3)ができないし、ただしを満たしているのかもあいまいです。 文字列の入力の形式:char *gets(char *buffer)を用いればどうにかなるのではと思っていますがどうですか? 説明が長くなって申し訳ありませんが教えてください。 よろしくお願いします。

みんなの回答

回答No.2

>自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 scanf("%s", str); scanfの「%s」は「入力の非読文字(空白、改行、タブなど)をスキップし、可読文字のみを取り込み、非読文字(空白、改行、タブなど)が来たら打ち切る」と言う動作をします。 つまり「Ka」まで取り込んで、次に半角スペースが来たので「Ka」だけをstrに格納します。その後ろにある半角スペースと「si」は、ストリーム(キーボード)の入力バッファに残ったままになります。 >あと(3)ができないし 1文字づつ「これは大文字だから小文字に、これは小文字だから大文字に、それ以外はそのまま」と言う処理が必要。 現状のプログラムは「大文字か小文字か判定しないで、toupper、tolowerにオンブにダッコ」してるから、少し考えないとならない。 >ただしを満たしているのかもあいまいです。 満たしていませんよ。 (1)は良いとして、(2)を実行する時に「入力した文字列ではなく、(1)で大文字に変換した文字列を、小文字に変換している」ので、問題の指示に従っていません。 (2)や(3)を実行する際には「入力したままで、書き替えしてない文字列」を変換させないとなりません。 ですが、質問者さんのプログラムでは(1)を実行し終わったら「入力したままで、書き替えしてない文字列」は失われています。 入力された変換前の文字列と、変換後の文字列を別にしろ、と言っているのですから、何度か変換を繰り返した後でも「入力された変換前の文字列が表示可能」でなければなりません。 つまり、質問者さんのプログラムで、変換して表示したあと、以下のように name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); ★ printf("元の文字列: %s\n", ???); return 0; 「★の位置で、入力したままの、変換も何もしてない文字列を表示しろ」と言われたら、何もしてない文字列を表示出来ないと駄目なのです。 でも、質問者さんのプログラムでは、それは不可能です。 なので、今のまま提出しても「解答が題意に添ってないので不可の判定を貰う」でしょう。

cutebut
質問者

補足

どうすれば題意に添ったプログラムになるか教えてもらえませんか? よろしくお願いします。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

scanf()直後のstrの中身を見てみればはっきりするでしょうが、スペースで入力終了扱いになっていてstr自体が"Ka"で終わってそうですね。 なお使うならgets()ではなくfgets()にしましょう。 また、この関数仕様では入力した配列を直接変換しているので「変換後の配列を別に定義する」という条件が全く満たせていません。

関連するQ&A