-1

本质上,我正在尝试编写代码来执行从变量 n 的 ASCII 位模型到变量 x 的仅幅度位模型的转换。我只是假设用户只输入了三位数字。这是我到目前为止所拥有的:

#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

虽然 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*,这与函数家族不同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 回答
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 回答