質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3193閲覧

c言語 大文字を小文字 小文字を大文字に

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/11/16 21:10

編集2021/11/17 00:01

プログラミング初心者です。
現在c言語を勉強しています。
標準入力に英文を入力すると,大文字を小文字に,小文字を大文字に,数字を「*」に変換して
標準出力に出力するプログラムを書いていたのですが
どうしてもわからないことがありましたので投稿させていただきます。

標準入力に
「qwErt\n
asdff\n
zxcvb\n」
と入力をした際に、標準出力に
「QWeRT\n
ASDFF\n
ZXCVB\n」
と標準出力に出力されてほしいのですが

「QWeRT\n
asdff\n
zxcvb\n」
といった風に一行目にはプログラムが適用されるのですが
二行目以降,プログラムが適用されず困っています。

有識者の方どなたか知恵をお貸しください。

#include <stdio.h> int main(void) { char ch[256]; int f=0; while(fgets(ch,256,stdin)){ while(ch[f]!='\0'){ if('a'<=ch[f] && ch[f]<='z'){ ch[f] -= 'a'-'A'; } else if('A'<=ch[f] && ch[f]<='Z'){ ch[f] +='a'-'A'; } else if('0'<=ch[f] && ch[f]<='9'){ ch[f] = '*'; } f++; } printf("%s" , ch); } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/11/16 23:42

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10252630305 teratailのローカルルールではありますが、それを承諾の上でここを使っているのでしょうから https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 の処置をしてください
dodox86

2021/11/17 00:11

で、とっとと退会。
guest

回答2

0

scanf("%s" , ch);

書式指定:%s は空白を読み込めません。
fgets 等を使いましょう。

※ gets の方が簡単だけど非推奨。

投稿2021/11/16 21:43

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

おはようございます。

入力文字がスペースで区切られている場合、scanfの仕様で先頭文字のみ変数chに代入されるのが

原因と考えられます。代わりにfgetsを使いましょう。

あと変数fがループの直前で0に初期化されていないので、それも直しておきます。

C

1#include <stdio.h> 2 3int main(void) { 4 char ch[256]; 5 int f; 6 7 fgets(ch,sizeof(ch),stdin); 8 f = 0; 9 printf("%s\n",ch); 10 while(ch[f]!='\0'){ 11 if('a'<=ch[f] && ch[f]<='z'){ 12 ch[f] -= 'a'-'A'; 13 } 14 else if('A'<=ch[f] && ch[f]<='Z'){ 15 ch[f] +='a'-'A'; 16 } 17 else if('0'<=ch[f] && ch[f]<='9'){ 18 ch[f] = '*'; 19 } 20 f++; 21 } 22 23 printf("%s\n" , ch); 24 25 return 0; 26 27}

実行結果は以下のとおりです。

pEn aPPle pen PeN AppLE PEN

参考になれば幸いです。

※入力が複数行に渡る場合の対応について、以下に記載します。

C

1#include <stdio.h> 2 3int main(void) { 4 char ch[256]; 5 int f; 6 7 while(fgets(ch,sizeof(ch),stdin)){ 8 f = 0; 9 while(ch[f]!='\0'){ 10 if('a'<=ch[f] && ch[f]<='z'){ 11 ch[f] -= 'a'-'A'; 12 } 13 else if('A'<=ch[f] && ch[f]<='Z'){ 14 ch[f] +='a'-'A'; 15 } 16 else if('0'<=ch[f] && ch[f]<='9'){ 17 ch[f] = '*'; 18 } 19 f++; 20 } 21 printf("%s\n" , ch); 22 } 23 24 return 0; 25 26}

実行結果は以下のとおりです。

PeN AppLE PEN PINEAPPLE

いかがでしょうか。

投稿2021/11/16 21:47

編集2021/11/16 22:27
srsnsts

総合スコア508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/16 22:03

ご丁寧に本当にありがとうございます。 質問の書き方が悪くて申し訳ないのですが 「pEn aPPle pen\n pineapple」 のような改行文字を含む文字列を標準入力に入力した場合に 「PeN AppLE PEN」までしか出力されないのですが この場合はどうしたらいいのでしょうか・・・
srsnsts

2021/11/16 22:25

fgetsは行単位で文字列を読み込む関数なので、 入力が複数行に渡る場合は fgetsをwhileループで回す処理が必要になります。 質問の要件の文章を変更しておいて下さい。 私はコードを変更しておきます。
thkana

2021/11/16 23:14

今度は --- Pen AppLE PEN(改行) pEn aPPle pen(改行) PINEAPPLE(改行) pineapple(改行) --- のように入力/出力が画面上交互に出るのがイヤ、とか言われそうな予感。(その場合どうやって入力の終了を知るのか、という問題が出てきますが) どうだったら満足なのか、質問者さんには先に"全て"提示しておいて欲しいですね。 あとからダメ出しって回答する側としてはとてもイヤな行為です。場合によっては回答にかけた労力が全部ムダ、ということにもなるのですから。
退会済みユーザー

退会済みユーザー

2021/11/16 23:36

私の知識量がないばかりにお手数おかけしてしまい申し訳ありませんでした。 ご丁寧に教えてくださったsrsnstsさん、ご指摘いただいたthkanaさん、epistemeさん。 大変勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問