-1

基本的に、変数nのASCIIビットモデルから変数xの大きさのみのビットモデルへの変換を実行するコードを作成しようとしています。ユーザーが入力に3桁しか入力しないと想定しています。これが私がこれまでに持っているものです:

#include <stdio.h>
main()
{
  char n[10];
  int x;
  printf("Enter three digit, nonnegative: ");
  scanf("%s" ,n);
  .
  .
  .
  printf("The number is %d\n", x);
}

どんな助けでも大歓迎です。

編集:マグニチュードのみのビットモデル:最も単純なビットモデルは、非負の整数用です。この場合、各ビットは2の非負の整数乗を表します。ビット値0は、場所の値0を示します。ビット値1は、場所の値を示します。表示される数値の合計値は、すべてのビットの場所の値を合計することによって求められます。例:8ビットで表される値は19:0 + 0 + 0 + 16 + 0 + 0 + 2 + 1=19です。

4

3 に答える 3

0
#include <stdio.h>

int main(void){
    char n[10];
    int x=0;
redo:
    printf("Enter three digit, nonnegative: ");
    if(4!=scanf("%1[1-9]%1[0-9]%1[0-9]%1[\n]", &n[0],&n[1],&n[2],&n[3])){
        fflush(stdin);
        goto redo;
    }
    //printf("%s\n",n);
    x = 100*(n[0]-'0')+10*(n[1]-'0')+(n[2]-'0');
    printf("The number is %d\n", x);
    return 0;
}
于 2012-05-07T23:32:21.697 に答える
0

BLUEPIXYには、技術的には要求どおりの答えがありますが、難読化されたCコンテストに参加しない限り、非常に複雑で、実際のプログラムに必要なものではない可能性があります。あなたはおそらくもっと次のようなものが欲しいでしょう:

int main() {
    int x;

    printf("Enter three digit, nonnegative: ");
    while (scanf("%d", &x) != 1 || x < 100 || x > 999) {
        printf("Not a valid input, try again: ");
        fflush(stdin);
    }
    printf("The number is %d\n", x);
    return 0;
}

これは、BLUEPIXYが作成したものとは異なり、異なる入力を受け入れます。特に、空白を許可(および無視)し、数字の後の余分な部分を無視し、先頭の数字が0の場合は4桁以上の数字を入力できるため、最終的な数字は100..999になります。特にそのような入力を禁止したい場合は、彼が書いたもののようなものが必要になります。

于 2012-05-08T00:38:45.447 に答える
0

既存の回答は両方ともを使用しますがscanf、これは常に間違いです。この場合、scanfユーザーが入力する数字が多すぎると未定義の動作を示すため、間違いです。私はこれを作り上げていません。

Cでユーザー入力を読み取るためのより良い方法は、一度に行全体を読み取るために使用しfgets(またはgetline、使用可能で長い行が懸念される場合)、strto*関数ファミリーを使用して数値を2進数に変換するscanfことです。 -入力オーバーフローでの動作を定義しました。また、他の種類の不正な入力の検出と回復が非常に簡単になります(この場合、実際には問題にはなりませんが、入力形式がもう少し複雑な場合は問題になります)。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char buf[10], *endp;
    unsigned long n;
    int c;
    for (;;) {
        fputs("Enter three digit, nonnegative: ", stdout);
        fgets(buf, sizeof buf, stdin);
        n = strtoul(buf, &endp, 10);
        if (n <= 999 && *endp == '\n')
            break;
        puts("?Redo from start");
        do c = getchar(); while (c != '\n' && c != EOF);
    }
    printf("The number is %lu\n", n);
    return 0;
}
于 2013-08-07T16:17:32.740 に答える