Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定C输入是否为8位二进制数_C_Validation_Input_Binary - Fatal编程技术网

如何确定C输入是否为8位二进制数

如何确定C输入是否为8位二进制数,c,validation,input,binary,C,Validation,Input,Binary,我正在写一个程序,它会把二进制值转换成十六进制,反之亦然 用户应输入一个值,该值将存储在int变量中。我需要确定这个用户输入是否是一个8位二进制数,比如10010010、11110000、10101010等等 我已经编写了一个函数来确定用户输入的字符数,但是对于如何确保用户的输入是1或0,我没有找到太多的信息 这只是一个我没有看到的简单解决方案吗 像这样使用: char st[1024]; fgets(st, sizeof(st), stdin); int i = 0; for (;;) {

我正在写一个程序,它会把二进制值转换成十六进制,反之亦然

用户应输入一个值,该值将存储在int变量中。我需要确定这个用户输入是否是一个8位二进制数,比如10010010、11110000、10101010等等

我已经编写了一个函数来确定用户输入的字符数,但是对于如何确保用户的输入是1或0,我没有找到太多的信息

这只是一个我没有看到的简单解决方案吗

像这样使用:

char st[1024];
fgets(st, sizeof(st), stdin);
int i = 0;
for (;;) {
  if (i == 8) {
    if (st[i] == '\n') {
      //right
    } else {
      //error
    }
    break;
  }
  if (st[i] != '0' && st[i] != '1') {
      // error
      break;
  }
  ++i;
}
这样使用:

char st[1024];
fgets(st, sizeof(st), stdin);
int i = 0;
for (;;) {
  if (i == 8) {
    if (st[i] == '\n') {
      //right
    } else {
      //error
    }
    break;
  }
  if (st[i] != '0' && st[i] != '1') {
      // error
      break;
  }
  ++i;
}

如果您的程序将用户输入存储在字符数组(字符串)中,则可以使用
strspn
函数从给定字符串中搜索第一个不匹配字符

#include <stdio.h>
#include <string.h>

int main () {
  const char user_input[] = "101th";
  const char bdigits[] = "01";

  int i = strspn (user_input, bdigits);
  printf("Not a binary digit at position %d.\n",i);
  return 0;
}
#包括
#包括
int main(){
常量字符用户输入[]=“第101”;
常量字符bdigits[]=“01”;
int i=strspn(用户输入,数字);
printf(“位置%d处不是二进制数字。\n”,i);
返回0;
}

如果您的程序将用户输入存储在字符数组(字符串)中,您可以使用
strspn
函数从给定字符串中搜索第一个不匹配字符

#include <stdio.h>
#include <string.h>

int main () {
  const char user_input[] = "101th";
  const char bdigits[] = "01";

  int i = strspn (user_input, bdigits);
  printf("Not a binary digit at position %d.\n",i);
  return 0;
}
#包括
#包括
int main(){
常量字符用户输入[]=“第101”;
常量字符bdigits[]=“01”;
int i=strspn(用户输入,数字);
printf(“位置%d处不是二进制数字。\n”,i);
返回0;
}

只需用户输入8位数值即可,而无需输入字符,然后尝试将结果字符串转换为可操作的数值。无论是以十进制、十六进制还是八进制输入,结果值始终作为二进制值存储在内存中

由于您希望将输入限制为8位值,C99引入了精确的宽度变量类型,消除了架构之间类型大小的任何歧义。了解
char
unsigned char
在几乎每个系统上都定义为1字节/8位,其中
long
等类型在某些系统(例如x86)上可以是4字节,在其他系统(例如x86_64)上可以是8字节。使用精确宽度类型可以消除所有歧义

确切的宽度类型在
stdint.h
中定义,与
printf
scanf
一起使用的宏在
inttypes.h
中定义(注意:
inttypes.h
需要包含
stdint.h
,因此如果使用宏,只需要
inttypes.h
),请参见:

在需要8位值时,输入较大类型的临时变量(例如64位值)然后测试输入的值是否在8位值的范围内是很有用的。一个简单的有条件检查
无符号
值是否为
0-255
有符号
值是否为
-128到127
就足够了。如果输入的值不符合无符号/有符号类型的范围,则它不是8位值

读取用户输入并验证转换以及值是否在8位范围内后,您可以使用
inttypes.h
中提供的宏(针对无符号和十六进制类型)以及输出填充二进制表示形式的简单函数以任意基数输出值

总而言之,您可以执行以下操作:

#include <stdio.h>
#include <limits.h>     /* for CHAR_BIT */
#include <inttypes.h>   /* for exact width macros, includes <stdint.h> */

/** binary representation of 'v' padded to 'sz' bits.
 *  the padding amount is limited to the number of
 *  bits in 'v'. valid range: 0 - sizeof v * CHAR_BIT.
 */
void binprnpad (const uint64_t v, size_t sz)
{
    if (!sz) {      /* validate sz not zero */
        fputs ("error: invalid sz.\n", stderr);
        return;
    }
    if (!v)  {      /* handle v = 0 case */
        while (sz--)
            putchar ('0');
        return;
    }

    if (sz > sizeof v * CHAR_BIT)   /* validate size not greater than bits */
        sz = sizeof v * CHAR_BIT;

    while (sz--)    /* output char representation of binary value */
        putchar ((v >> sz & 1) ? '1' : '0');
}

int main (void) {

    uint64_t tmp = 0;   /* temporary value to store user input value */

    fputs ("enter a value: ", stdout);          /* prompt */
    if (scanf ("%" SCNu64, &tmp) == 1) {        /* read/validate input */
        if (tmp <= UINT8_MAX) {                 /* check 8-bit value */
            uint8_t val = (uint8_t)tmp;         /* assign 8-bit value */
            printf ("\nunsigned : %" PRIu8      /* output dec, hex */
                    "\nhex      : %" PRIx8
                    "\nbinary   : ", val, val);
            binprnpad (val, sizeof val * CHAR_BIT); /* output binary */
            putchar ('\n');     /* tidy up with newline */
        }
        else    /* handle error: not an 8-bit value */
            fputs ("error: entry exceeds 8-bit value.\n", stderr);
    }
    else    /* handle error: invalid input */
        fputs ("error: invalid entry.\n", stderr);
}
如果用户试图输入超出8位值范围的内容:

$ ./bin/8bitentry
enter a value: 256
error: entry exceeds 8-bit value.
将输入作为二进制值的字符串表示形式

唯一一种不需要如上所述输入的情况是,如果您确实希望用户以字符串形式输入二进制表示,然后您希望将其转换为数值。处理包含二进制值表示的字符串的最简单方法是使用
strtoul
提供的base-2转换。这允许通过使用
endptr
参数仅验证输入的
'0
'1
来完成输入错误检查。看

使用
'0
'1
的字符串条目的简单实现可以是:

#include <stdio.h>
#include <stdlib.h>     /* for strtoul */
#include <errno.h>      /* for errno */

#define MAXC 1024

int main (void) {

    char buf[MAXC],
        *endptr;        /* end pointer for use with strtoul */
    unsigned long tmp;
    unsigned char val;

    fputs ("enter an 8-bit binary no.: ", stdout);  /* prompt */
    if (fgets (buf, MAXC, stdin) == NULL) {
        fputs ("(user canceled input)\n", stderr);
        return 1;
    }

    errno = 0;                          /* reset errno 0 */
    tmp = strtoul (buf, &endptr, 2);    /* convert base2 string to value */
    if (buf == endptr) {
        fputs ("error: invalid binary entry.\n", stderr);
        return 1;
    }
    else if (errno) {
        fputs ("error: over/underflow occured.\n", stderr);
        return 1;
    }
    else if (tmp > 255) {
        fputs ("error: input exceeds 8-bit value.\n", stderr);
        return 1;
    }
    else if (*endptr != '\n' && *endptr != 0)
        fprintf (stderr, "warning: conversion ended at invalid char '%c'\n",
                *endptr);

    val = (unsigned char)tmp;
    printf ("unsigned: %hhu\nhex     : %hhx\n", val, val);
}
或用户输入超过8位的二进制值:

$ ./bin/8bitentry_string
enter an 8-bit binary no.: 111111111
error: input exceeds 8-bit value.
或用户输入以无效字符开头的值:

$ ./bin/8bitentry_string
enter an 8-bit binary no.: 310
error: invalid binary entry.
$ ./bin/8bitentry_string
enter an 8-bit binary no.: 10131
warning: conversion ended at invalid char '3'
unsigned: 5
hex     : 5
或用户输入包含无效字符的值:

$ ./bin/8bitentry_string
enter an 8-bit binary no.: 310
error: invalid binary entry.
$ ./bin/8bitentry_string
enter an 8-bit binary no.: 10131
warning: conversion ended at invalid char '3'
unsigned: 5
hex     : 5

如果您还有其他问题,请仔细查看并告诉我。

不需要输入字符,然后尝试将生成的字符串转换为可操作的数值,只需用户输入8位数值即可。无论是以十进制、十六进制还是八进制输入,结果值始终作为二进制值存储在内存中

由于您希望将输入限制为8位值,C99引入了精确的宽度变量类型,消除了架构之间类型大小的任何歧义。了解
char
unsigned char
在几乎每个系统上都定义为1字节/8位,其中
long
等类型在某些系统(例如x86)上可以是4字节,在其他系统(例如x86_64)上可以是8字节。使用精确宽度类型可以消除所有歧义

确切的宽度类型在
stdint.h
中定义,与
printf
scanf
一起使用的宏在
inttypes.h
中定义(注意:
inttypes.h
需要包含
stdint.h
,因此如果使用宏,只需要
inttypes.h
),请参见:

在需要8位值时,输入较大类型的临时变量(例如64位值)然后测试输入的值是否在8位值的范围内是很有用的。一个简单的有条件检查
无符号
值是否为
0-255
有符号
值是否为
-128到127
就足够了。如果输入的值与未签名的范围不符/