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

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

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

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

Q&A

解決済

2回答

435閲覧

一文字は表示できるけど、複数文字ができない

ryu72639

総合スコア14

C

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

0グッド

0クリップ

投稿2018/07/17 09:03

編集2018/07/17 09:46

入力された文字列を,1文字ずつ以下のルールに従って暗号化して画面に表示するプログラムを作成せしよとしました.

英大文字は,アルファベット順で次の文字(Zの次はAとする)にし英小文字に変換する.(例)A → b,F → g,Z → a
英小文字は,アルファベット順で前の文字(aの前はzとする)にし英大文字に変換する.(例)a → Z,k → J,z → Y
数字は,1文字ずつ10の補数に変換せよ.ただし0 は 0 のままとする.(例)9 → 1,3 → 7
記号(英数字以外)は変換しない.

入力される文字列は,文字数が512文字以下で,改行コードを含まないとし、(スペース,タブは含まれることがある)

一文字だけ入力すると、答えが表示できるようになりましたが、複数文字を入力できるようにする方法がわかりません。助けてください!

スペースで区切られてなければ、できるようになりました。しかし、スペースで区切られると、スペースの前まではできるんですけど、そっから先は表示されません。どうすればいいのでしょうか

c

1#include <stdio.h> 2#include <string.h> 3 4//大文字を小文字に変換 \ 5 6char tolowr(char c) 7{ 8 return (c + 0x21); 9} 10 11/* 小文字を大文字に変換 */ 12char toupr(char c) 13{ 14 return (c - 0x1f); 15} 16 17int main(void) 18{ 19 char ci, co, Co; /* ci : 入力文字 / co : 出力文字 */ 20 int i; 21 22 // printf("Input Charactor : "); \ 23 24 scanf("%c", &ci); 25 26 /* アルファベットか数字かを判定 */ 27 if( (ci>='a'&& ci<='z') || (ci>='A' && ci<='Z')){ 28 // printf("入力した文字「%c」はアルファベット\n", ci); \ 29 30 if (ci>='A' && ci<='Y'){ 31 co = tolowr(ci); 32 printf("%c\n", co); 33 } 34 35 if (ci == 'Z'){ 36 printf("a\n"); 37 } 38 39 if(ci>='a'&& ci<='y'){ 40 Co = toupr(ci); 41 printf("%c\n", Co); 42 } 43 44 if(ci == 'z'){ 45 printf("A\n"); 46 } 47 } 48 49 else if(ci > '0'&& ci<='9'){ 50 /* printf("入力した文字「%c」は数字です。\n", ci);*/ \ 51 ci = 10 - ci; 52 printf("%c\n", ci ); 53 } 54 else if(ci == '0'){ 55 printf("%c\n", ci); 56 } 57 else 58 printf("「%c」はアルファベットでも数字でもありません。\n", ci); 59 60 return 0; 61}

c

1 2#include <stdio.h> 3#include <string.h> 4 5//大文字を小文字に変換 \ 6\ 7 \ 8 9char tolowr(char c) 10{ 11 return (c + 0x21); 12} 13 14/* 小文字を大文字に変換 */ 15char toupr(char c) 16{ 17 return (c - 0x21); 18} 19 20int main(void) 21{ 22 char ci[512] = {0}; 23 char co[512] = {0}; 24 char Co[512] = {0}; /* ci : 入力文字 / co : 出力文字 */ 25 int i; 26 27 // printf("Input Charactor : "); \ 28 29 scanf("%s", ci); 30 31 for(i = 0; i < sizeof(ci); i++){ 32 /* アルファベットか数字かを判定 */ 33 if( (ci[i]>='a'&& ci[i]<='z') || (ci[i]>='A' && ci[i]<='Z')){ 34 // printf("入力した文字「%c」はアルファベット\n", ci); \ 35 36 if (ci[i]>='A' && ci[i] <='Y'){ 37 co[i] = tolowr(ci[i]); 38 printf("%c", co[i]); 39 } 40 41 if (ci[i] == 'Z'){ 42 printf("a"); 43 } 44 45 if(ci[i]>='b'&& ci[i]<='z'){ 46 Co[i] = toupr(ci[i]); 47 printf("%c", Co[i]); 48 } 49 50 if(ci[i] == 'a'){ 51 printf("Z"); 52 } 53 } 54 55 else if(ci[i] > '0'&& ci[i] <= '9'){ 56 /* printf("入力した文字「%c」は数字です。\n", ci);*/ \ 57 ci[i] = 10 - ci[i]; 58 printf("%c", ci[i]); 59 } 60 else if(ci[i] == '0'){ 61 printf("%c", ci[i]); 62 } 63 else { 64 printf("%c", ci[i]); 65 } 66 } 67 68 printf("\n"); 69 70 return 0; 71} 72 73 74

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

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

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

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

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

guest

回答2

0

大文字、小文字をそれそれ配列で準備し変換する方法もあります。
for文を使って変換すればいいです。

また、512などの定数は記号定数にしましょう。

C

1#include <stdio.h> 2#include <string.h> 3 4#define BUFSIZE 512 5#define ALPHABET 26 6#define NUMBER 11 7 8char change_text(char c); 9 10int main(void) 11{ 12 char buf[BUFSIZE]; 13 int i; 14 fgets(buf,sizeof(buf),stdin); 15 16 for(i = 0; i < 512; i++){ 17 buf[i] = change_text(buf[i]); 18 } 19 printf("%s",buf); 20 return 0; 21} 22 23char change_text(char c) 24{ 25 char oomoji[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 26 char komoji[ALPHABET] = "abcdefghijklmnopqrstuvwxyz"; 27 char number[NUMBER] = "01234567890"; 28 int i; 29 30 for(i = 0; i < ALPHABET; i++){ 31 if(c == oomoji[i]){ 32 c = komoji[(i + 1) % ALPHABET]; 33 break; 34 } 35 else if(c == komoji[i]){ 36 c = oomoji[(i - 1 + ALPHABET) % ALPHABET]; 37 break; 38 } 39 } 40 for(i = 0; i < NUMBER; i++){ 41 if(c == number[i]){ 42 c = number[10 - i]; 43 break; 44 } 45 } 46 return c; 47}

投稿2018/07/17 12:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

  • 1文字を暗号化する関数を作る
  • 上の関数を使って、文字列を暗号化する関数を作る
  • 暗号化した1文字を戻して表示する関数を作る
  • 上の関数を使って、文字列を戻して表示する関数を作る
  • 1文字入力、ではなく、文字列の入力を行う
  • 文字列が得られたら、上の関数で暗号化する
  • 暗号化した文字列を、上の関数を使って表示する
  • バッチシ!

投稿2018/07/17 09:22

y_waiwai

総合スコア87719

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

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

ryu72639

2018/07/17 09:46

スペースで区切られてなければ、できるようになりました。しかし、スペースで区切られると、スペースの前まではできるんですけど、そっから先は表示されません。どうすればいいのでしょうか
y_waiwai

2018/07/17 11:24

> scanf("%s", ci); これだと、スペースが入ればそこで入力が打ち切られます なので、ここは fgets(ci,sizeof(ci),stdin); にしときましょう んで、 > for(i = 0; i < sizeof(ci); i++){ これは for(i = 0; i < strlen(ci); i++){ にしときましょう
ryu72639

2018/07/17 11:39

なるほど!ありがとうございます!
ryu72639

2018/07/17 22:29

sizeofとstrlenの違いはなんなのでしょうか?どちらとも長さを求めるものですよね?
y_waiwai

2018/07/17 22:45

strlen 文字列長を取得 sizeof 対象のサイズを取得 双方とも長さだけど、ちょっと違いますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問