如何区分" 01"和" 1"在C.

时间:2017-03-15 13:31:02

标签: c

我希望用户输入2位二进制数。除非输入" 0"或" 1"。根据定义,0和1不是2位二进制,但程序将01视为1,因此它从while循环退出。我该如何解决?基本上,我如何让计算机区分01和1?

int n_bin; 

while(n_bin!=01 && n_bin!=00 && n_bin!=10&&n_bin!=11) {;
    printf("Your entered number is %d\n Please enter a 2-digit binary number! \n",n_bin);
    scanf("%d",&n_bin);
}

我可以使用char,但我无法使用数组。

3 个答案:

答案 0 :(得分:2)

int n_bin的分析不会确定是否已为其分配了"1""01"的用户输入。代码需要查看用户输入的区别。

使用字符阅读:

读取用户输入,一次一个字符。查找'0''1''\n'EOF或其他内容。

int n_bin = 0;
int length = 0;
int ch;
while ((ch = fgetc(stdin)) >= '0' || ch <= '1') {
  n_bin =  n_bin*2 + (ch - '0');  // *2 as this is base 2
  length++;
}

if (ch = '\n' || ch == EOF) {
  printf("Value (in decimal):%d  Character length:%d\n", n_bin, length);
  if (n_bin < 0 || n_bin > 3 || length != 2) puts("Non-conformance"):
} else {
  puts("Unexpected character entered");
} 

int的身份阅读,注意字符偏移:

如果您需要更高级的方法,请使用"%n"来记录扫描的字符数。

int n_bin;
int start, end;        
//                  v------- Consume leading white-space
//                  | v----- Store # of characters read
//                  | | v--- Scan/store int
//                  | | | v- Store # of characters read
int retval = scanf(" %n%d%n", &start, &n_bin, &end);
if (retval == 1) {
  if ((end - start) == 2 && n_bin >= 0 && n_bin <= 3) {
    puts("Success");
  } else {
    puts("Fail");
  }
else {
  // consume remaining characters in line
  http://stackoverflow.com/q/34219549/2410359
  puts("Fail");
}

注意:第二种方法将传递类似"+1"的输入。

答案 1 :(得分:0)

为什么没有一个读取2个字符的循环,确保它们为0或1,并在你继续时建立n_bin。

int i;
int n_bin=0;
int c;
int valid=0;
while(!valid)
  {
  valid=1;
  for(i=0;i<2;i++)
    {
    c=getchar();
    if ((c=='0')&&(c=='1'))
      {
      n_bin *= 2;
      n_bin += c-'0';
      }
    else
      {
      valid=0;
      break;
      }
    }
  if(!valid)
    {
    printf("Your entered number is %d\n Please enter a 2-digit binary number! \n",n_bin);
    }
  }

答案 2 :(得分:0)

如果类型为int,则计算机的1和01之间没有区别。你可以定义两个变量如下:

char digit1, digit2;
digit1 = getchar();
digit2 = getchar();
while( '0' <= digit1  && digit1 <= '9' && '0' <= digit2 && digit2 <= '9'){
//write the code you want.
//if diffrent instructions must be executed for 01 & 00, it must be written here.
//also instructions for other digits
}