【问题标题】:how to distinguish between "01" and "1" in C如何区分C中的“01”和“1”
【发布时间】:2017-03-15 13:31:01
【问题描述】:

我希望用户输入 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,但是我不能使用数组。

【问题讨论】:

  • 我认为strtol(string, &endptr, 2) 会从字符串转换为二进制数。
  • 如果您使用的是int,则无法区分。您必须保存到 char 数组(即字符串),并对其进行操作以获得您想要的。
  • 使用switch case 处理会更好。
  • 我可以使用 char,但是我不能使用数组。但由于 char 仅采用第一个元素,因此例如 01 将存储为 48(ASCII of 0)
  • 如果你不能使用数组,你可能不得不使用 2 个不在数组中的chars(例如:char c1, c2; scanf("%c%c", &c1, &c2);)。因为,同样,使用 int 无法区分 1 和 01。

标签: c


【解决方案1】:

没有对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" 之类的输入。

【讨论】:

  • 不要忘记在length上添加检查,如果它的值不是2是无效的。
  • @AntonH OP 在长度要求上有歧义:它应该区分还是只接受 2 位数字?无论如何,OP可以根据需要添加if (length == 2)if (length &gt;= 1 &amp;&amp; length &lt;= 2)的长度测试。
  • 即使length可以大于2,也应该限制在小于32,防止n_bin溢出。
  • @JeremyP 关于 OF 是真的。代码可以使用额外的代码/长度检查或unsigned 来处理没有UB 的溢出情况,或者在第二种情况下使用" %n%3d%n"。许多方法。 IMO,一个强大的解决方案会将用户输入的 line 读取到 string 中,然后对其进行解析:类似于#3 in this answer 的 base 2 版本。
  • 谢谢。会用这个方法。高度赞赏。
【解决方案2】:

为什么不使用一个读取 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);
    }
  }

【讨论】:

    【解决方案3】:

    如果类型是 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多