掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28554

シーザー暗号
投稿者---G3(2006/10/24 18:59:20)


はじめまして、G3です。
早速ですが、スレタイの通りシーザー暗号を作れるプログラムを作っていますが、返される文字がすべて「NULL」になってしまいます。
OSはWindowsXP Home Edition SP2、コンパイラはMicrosoft Visual Stadio Academic Editionです。

#include <stdio.h>

int r(int c, int n)
{
    if('c' >= 97) {
        c = 'c' + n;
        if('c' >= 123) c = 'c' - 26;
    }
    
    else if('c' <= 90) {
        c = 'c' + n;
        if('c' >= 91) c = 'c' - 26;
    }

    return 0;
}

int main(void)
{
    int c, n;

    printf("ずらす文字数を0以上25以下で入力してください。\n");
    scanf("%d" ,&n);

    rewind(stdin);

    printf("英文を入力してください。\n");
    while((c = getchar()) != EOF && c != '\n')
        printf("%s" ,r(c, n));

    putchar('\n');

    return 0;
}


よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:シーザー暗号 28556 YuO 2006/10/24 19:19:45
<子記事> Re:シーザー暗号 28557 zepto 2006/10/24 19:53:45


No.28556

Re:シーザー暗号
投稿者---YuO(2006/10/24 19:19:45)


2点,ひとつは小さな,ひとつは大きな問題点があります。

まずは小さい方を。
    if('c' >= 97) {
        c = 'c' + n;
        if('c' >= 123) c = 'c' - 26;
    }
    
    else if('c' <= 90) {
        c = 'c' + n;
        if('c' >= 91) c = 'c' - 26;
    }

'c'はVisual Studioを使っているなら常に0x63,つまりは99です。
不要なif文やブロックを削除すると,上記のコードは
    c = 'c' + n;

に等価となります。
'c'ではなくcにするのが本来の意図かと思います。
# なんで97だの123だのといった値を使うかな……。素直に'a'とか使わないのが不思議。読みにくいだけだし……。


そして大きい方。
        printf("%s" ,r(c, n));

r関数が返すのはint型で,実際にはchar型の値が入っているわけです。
%sというのは文字列,つまりはchar *型を表示するための物です。
char型の値を文字として表示したいのであれば,%cを使います。
# ここはあからさまな未定義動作。



この投稿にコメントする

削除パスワード

No.28558

Re:シーザー暗号
投稿者---G3(2006/10/24 20:48:49)


お返事ありがとうございます。

># なんで97だの123だのといった値を使うかな……。素直に'a'とか使わないのが不思議。読みにくいだけだし……。
まったく頭にありませんでした・・・。言われてみればと言う感じです。
ご指摘ありがとうございます。


この投稿にコメントする

削除パスワード

No.28557

Re:シーザー暗号
投稿者---zepto(2006/10/24 19:53:45)


>返される文字がすべて「NULL」になってしまいます。

どんな文字を入力しても return 0; しているのですから、
それを %s で出力すると (null) となるでしょうね。


この投稿にコメントする

削除パスワード

No.28559

Re:シーザー暗号
投稿者---G3(2006/10/24 20:50:04)


お返事ありがとうございます。

自分は言った何やっているんでしょう・・・
これはひどいミスでした・・・


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧