我希望用户输入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
,但我无法使用数组。
答案 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)
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
}