【解決方法】基数 8、基数 16、および 10 進数をその他に変換します。


こんにちは、最初に変換するベースをユーザーに入力してもらいたいと思います。 次に、他のベースの数が表示されます。 ただし、入力数値が 8 進数の場合にのみ機能します。 素敵な人がコードを見て、何が問題なのかを確認していただければ幸いです。 どうもありがとう。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    char c;
    printf("Enter a Base:(D,O,H)\n");
    c=getchar();
    printf("Enter a number:\n");
    switch(c)
    {
    case 'D':scanf("%d",&a);
    case 'H':scanf("%x",&a);
    case 'O':scanf("%o",&a);
    break;
    default:printf("Wrong Base!");
}

printf("Octal:%o\tHexadecimal:%X\tDecimal:%d\n",a,a,a);
}

私が試したこと:

同様のコードを検索して見ましたが、問題はまだ解決されていません。

解決策 1

あなたが行方不明です break あなたの最後のステートメント case ステートメント。 そのはず:

C
switch(c) {
    case 'D' :   scanf("%d", &a); break;
    case 'H' :   scanf("%x", &a); break;
    case 'O' :   scanf("%x", &a); break;
    default  :   printf("Wrong Base!\n");
}

それ以外の場合は、いわゆる「フォールスルー」が発生します。つまり、cis ‘D’ の場合、ケース ‘D’ が実行され、その後、実行がケース ‘H’ に「フォールスルー」します。 最近のコンパイラ (少なくとも gcc と clang) は、そうするように指示された場合、これに対して警告を出すことがあります。 そこには それは フォールスルー動作が必要な状況では、それが役立つ場合があります。 関連するのは、同じアクションが必要なケース値が複数ある状況です。 たとえば、あなたが持っているかもしれません

C
switch(c) {
    case 'd':
    case 'D':
      scanf("%d, &a); break;
   /* etc */
} 

これにより、ユーザーは、入力した文字の大文字と小文字に関係なく、期待されるアクションを取得できます。

ただし、ユーザーが無効なデータを入力した場合の対処方法を検討する必要がある場合があります。たとえば、8 進数を選択してから 99 を入力するとどうなるか、つまり “Hello” を入力するとどうなるかなどです。 また、基数を求めるプロンプトに対してユーザーが「8 進数」と入力した場合にどうなるかを考えてみてください。

コメント

タイトルとURLをコピーしました