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

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

ただいまの
回答率

90.53%

  • C

    3657questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 143

ryu72639

score 6

入力された文字列を,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文字以下で,改行コードを含まないとし、(スペース,タブは含まれることがある)

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

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

#include <stdio.h>
#include <string.h>

//大文字を小文字に変換                                                                              \
                                                                                                     
char tolowr(char c)
{
  return (c + 0x21);
}

/* 小文字を大文字に変換 */
char toupr(char c)
{
  return (c - 0x1f);
}

int main(void)
{
  char ci, co, Co;    /* ci : 入力文字 / co : 出力文字  */
  int i;

  // printf("Input Charactor : ");                                                                  \
                                                                                                     
  scanf("%c", &ci);

     /* アルファベットか数字かを判定 */
    if( (ci>='a'&& ci<='z') || (ci>='A' && ci<='Z')){
      // printf("入力した文字「%c」はアルファベット\n", ci);                                        \
                                                                                                     
      if (ci>='A' && ci<='Y'){
        co = tolowr(ci);
        printf("%c\n", co);
      }

      if (ci == 'Z'){
        printf("a\n");
      } 

      if(ci>='a'&& ci<='y'){
        Co = toupr(ci);
        printf("%c\n", Co);
      }

      if(ci == 'z'){
        printf("A\n");
      }
    }

    else if(ci > '0'&& ci<='9'){
      /* printf("入力した文字「%c」は数字です。\n", ci);*/                                          \
       ci = 10 - ci;
      printf("%c\n", ci );
    }
    else if(ci == '0'){
      printf("%c\n", ci);
    }
    else
      printf("「%c」はアルファベットでも数字でもありません。\n", ci);

  return 0;
}

        

#include <stdio.h>
#include <string.h>

//大文字を小文字に変換                                                                              \
\                                                                                                    
                                                                                                    \

char tolowr(char c)
{
  return (c + 0x21);
}

/* 小文字を大文字に変換 */
char toupr(char c)
{
  return (c - 0x21);
}

int main(void)
{
  char ci[512] = {0};
  char  co[512] = {0};
  char Co[512] = {0};    /* ci : 入力文字 / co : 出力文字  */
  int i;

  // printf("Input Charactor : ");                                                                  \
                                                                                                     
  scanf("%s", ci);

  for(i = 0; i < sizeof(ci); i++){
    /* アルファベットか数字かを判定 */
    if( (ci[i]>='a'&& ci[i]<='z') || (ci[i]>='A' && ci[i]<='Z')){
      // printf("入力した文字「%c」はアルファベット\n", ci);    \                                    

      if (ci[i]>='A' && ci[i] <='Y'){
        co[i] = tolowr(ci[i]);
        printf("%c", co[i]);
      }
        
      if (ci[i] == 'Z'){
        printf("a");
      }

      if(ci[i]>='b'&& ci[i]<='z'){
        Co[i] = toupr(ci[i]);
        printf("%c", Co[i]);
      }
    
      if(ci[i] == 'a'){
        printf("Z");
      }
    }

    else if(ci[i] > '0'&& ci[i] <= '9'){
      /* printf("入力した文字「%c」は数字です。\n", ci);*/      \
      ci[i] = 10 - ci[i];
      printf("%c", ci[i]);
    }
    else if(ci[i] == '0'){
      printf("%c", ci[i]);
    }
    else {
      printf("%c", ci[i]);
    }
  }

  printf("\n");

  return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 18:46

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

    キャンセル

  • 2018/07/17 20:24

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

    んで、
    > for(i = 0; i < sizeof(ci); i++){
    これは
    for(i = 0; i < strlen(ci); i++){
    にしときましょう

    キャンセル

  • 2018/07/17 20:39

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

    キャンセル

  • 2018/07/18 07:29

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

    キャンセル

  • 2018/07/18 07:45

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

    キャンセル

0

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

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

#include <stdio.h>
#include <string.h>

#define BUFSIZE 512
#define ALPHABET 26
#define NUMBER 11

char change_text(char c);

int main(void)
{
    char buf[BUFSIZE];
    int i;
    fgets(buf,sizeof(buf),stdin);

    for(i = 0; i < 512; i++){
        buf[i] = change_text(buf[i]);
    }
    printf("%s",buf);
    return 0;
}

char change_text(char c)
{
    char oomoji[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char komoji[ALPHABET] = "abcdefghijklmnopqrstuvwxyz";
    char number[NUMBER] = "01234567890";
    int i;

    for(i = 0; i < ALPHABET; i++){
        if(c == oomoji[i]){
            c = komoji[(i + 1) % ALPHABET];
            break;
        }
        else if(c == komoji[i]){
            c = oomoji[(i - 1 + ALPHABET) % ALPHABET];
            break;
        }
    }
    for(i = 0; i < NUMBER; i++){
        if(c == number[i]){
            c = number[10 - i];
            break;
        }
    }
    return c;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    +とーを交互に表示するプログラムを教えてください。

    読み込んだ値の個数だけ+とーを交互に表示するプログラムはどのように作成すればよいか教えてください。 読み込む値:(例:13)↲ +-+-+-+-+-+-+ こんな感じ

  • 解決済

    正しく動きません。。。

    include <stdio.h> int main(void) { int a=0,b=0; printf("入力をしてください\n"); while (1) {

  • 解決済

    C言語のfor文if分について、解答をお願いします。

    前提・実現したいこと こんにちは、初めての質問です。 1************************ 2************************ 3**********

  • 解決済

    C 言語strcpyについて

    線形リストを作ってその構造体の中にpathname配列に格納されている文字列を記憶させるプログラムを作っているのですが警告が出てきてうまく動作してくれません。"stack is s

  • 受付中

    【C言語】冗長だと思う数字入力プログラムを改善したい

    以下のプログラムは3つの数字をスペース区切りで入力して、入力した数字を改行区切りで出力するというコードです。 C言語はあまり慣れていないので、以下のコードに冗長さを感じますが何か改

  • 解決済

    char型の配列変数にchar型の変数を代入したい

    使用言語 C 環境 Visual Studio 2017 初めての質問です。 独学でプログラミングを始めたのですがわからないところがあり困っています。 char型の配列変数の使い方

  • 解決済

    3つの文字列の長さを比較したい

    こんにちは C言語についての質問ですが キーボードから入力された3つの文字列の長さを比較して一番長い文字列をprintf()で表示させたいのですがこの場合strcmp関数で比較する

  • 解決済

    ポインタによる文字列の探索

    #include <stdio.h> #include <string.h> int main(void) { char *s = "abcdef"; //int

同じタグがついた質問を見る

  • C

    3657questions

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