掲示板利用宣言

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

 私は

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

掲示板2

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

No.30160

switchが想定通りに動作しない
投稿者---神代 刹那(2007/05/22 07:56:30)


ソースファイル
http://nanami-city.info/files/20070522075254.c

Yないしyが入力された時にfirstラベルに飛ばしたいのですが
どうにも上手く動作してくれません
(endラベルには飛ばせるのですが・・・)

ifとbreakを使った方法も試してみたのですが、やはり17行目のwhileに飛ばす事は出来ませんでした

一体何が原因なのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:switchが想定通りに動作しない 30161 神代 刹那 2007/05/22 07:58:05


No.30161

Re:switchが想定通りに動作しない
投稿者---神代 刹那(2007/05/22 07:58:05)


因みに環境は
OS Windows Vista Business
コンパイラ Borland C++ Compiler 5.5
です


この投稿にコメントする

削除パスワード

No.30162

Re:switchが想定通りに動作しない
投稿者---acid(2007/05/22 09:21:00)


そもそもプログラムとして、正しい結果が得られていないと思うんだが…
「a」を入れると「大文字のAです」
「A」を入れると「小文字のaです」と表示される。
しかも誰から助言を貰っているか知りませんが、随分古めかしいな。

・mainはint型を返すべき。
・goto文は基本的に使わない。
 (どうしても必要があれば別だが、このプログラムには必要性は無い)
・インデントおかしい。
・isupper、islowerの条件判定が逆。


本題のgetcharですが、以下のページを参考にしてください。(2)ね。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4
ようは改行がtextに読み込まれちゃうんですな。

普通はバッファをクリアする処理をいれるか、fgetsを使うかします。



この投稿にコメントする

削除パスワード

No.30163

Re:switchが想定通りに動作しない
投稿者---bugs(2007/05/22 09:41:48)


>「a」を入れると「大文字のAです」
>「A」を入れると「小文字のaです」と表示される。

「a」を入れると「大文字『は』Aです」
「A」を入れると「小文字『は』aです」
と表示するので、結果は正しいです。

>・isupper、islowerの条件判定が逆。

正しいです。


この投稿にコメントする

削除パスワード

No.30164

Re:switchが想定通りに動作しない
投稿者---TT414(2007/05/22 10:29:34)


>しかも誰から助言を貰っているか知りませんが、随分古めかしいな。
>・mainはint型を返すべき。

「mainはint型を返すべき」と書くのも古いです。C99及びJIS-Cの2003以降はint mainは必須ではありません。


この投稿にコメントする

削除パスワード

No.30165

Re:switchが想定通りに動作しない
投稿者---円零(2007/05/22 12:34:58)


>「mainはint型を返すべき」と書くのも古いです。C99及びJIS-Cの2003以降はint mainは必須ではありません。

ISO/IEC 9899によれば、
    5.1.2.2.1 Program startup
1   The function called at program startup is named main. The implementation declares no
    prototype for this function. It shall be defined with a return type of int and with no 
    parameters:

            int main(void) { /* ... */ }

    or with two parameters (referred to here as argc and argv, though any names may be used,
    as they are local to the function in which they are declared):

            int main(int argc, char *argv[]) { /* ... */ }

    or equivalent;9) or in some other implementation-defined manner.

______________________________

    9) Thus, int can be replaced by a typedef name defined as int, or the type of argv can
       be written as char ** argv, and so on.

要するに、処理系定義の方法としてOKということでしょうか。
まあ「処理系がいいって言ってんだからいいんだよ。」というのも尤もではありますが…
しかし可搬性に対する警告として「int mainとすべき」というのも一理あるわけで、
別に「古い」というわけではないでしょう。


この投稿にコメントする

削除パスワード

No.30166

Re:switchが想定通りに動作しない
投稿者---TT414(2007/05/22 13:26:35)


>しかし可搬性に対する警告として「int mainとすべき」というのも一理あるわけで、

同感です。ただNo.30162には「返すべき」とあるので、強制までされることは無いと思うので書きました。

>別に「古い」というわけではないでしょう。
>>しかも誰から助言を貰っているか知りませんが、随分古めかしいな。

とあるからには最新版の情報を書くべきで、古いことは古いです。


この投稿にコメントする

削除パスワード

No.30170

Re:switchが想定通りに動作しない
投稿者---Hermit(2007/05/22 19:59:10)


>とあるからには最新版の情報を書くべきで、古いことは古いです。

コンパイラ Borland C++ Compiler 5.5
と書いてあるので、それに沿って情報を書くべきでは(^^;

元ソース今見ると、return 0; が書いて有るけど、
修正済み?

一応こんなんでいい気はしますが。
  case 'Y': // 問題あり
  case 'y':
    while (getchar() != '\n')
      ;	/*改行まで読み飛ばす*/
    goto first;




この投稿にコメントする

削除パスワード

No.30185

Re:switchが想定通りに動作しない
投稿者---円零(2007/05/23 12:38:40)


>一応こんなんで
(以下略)

でもやっぱり、眺めてるうちに関数切り分けたくなってきますよねえ。
#include <stdio.h>
#include <ctype.h>

int getinitialchar(void){
    int c = getchar();
    if(c != '\n') while(getchar() != '\n');
    return c;
}

int errorroutine(void){
    int i, answer;
    for(i = 0; i < 10; i++){
        printf("エラー\nアルファベット以外の値が入力されました。\n\n継続して入力しますか?\nY/N\n");
        answer = getinitialchar();
        switch(answer){
            case 'Y':
            case 'y':
                return 1;
            case 'N':
            case 'n':
                return 0;
        }
    }
    return 0;
}

int main(void){
    int text;
    do{
        printf("アルファベットを入力して下さい。\n");
        text = getinitialchar();
        if(isupper(text))
            printf("入力されたアルファベットの小文字は %c です。", text = tolower(text));
        else if(islower(text))
            printf("入力されたアルファベットの大文字は %c です。", text = toupper(text));
        else
            if(errorroutine()) continue;
    }while(0);
    printf("\nExiT");
    return 0;
}




この投稿にコメントする

削除パスワード

No.30189

Re:switchが想定通りに動作しない
投稿者---Hermit(2007/05/23 19:37:58)


>でもやっぱり、眺めてるうちに関数切り分けたくなってきますよねえ。

それは確かに。

でも、どちらかというと、スレ主がまだ来ない方が気になるんだけど(^^;


この投稿にコメントする

削除パスワード

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