如何获取接受浮点数或字符作为值的 C 输入

How to get C input that accepts a float or a character as a value

提问人:D Chang 提问时间:11/14/2023 更新时间:11/15/2023 访问量:73

问:

正如我所说,我需要能够接受字符 a b c d e 作为输入,但它也需要能够接受任何浮点数。我不确定这是否可能,但如果有人知道一个简单的解决方法,将不胜感激。我不想使用任何输入来询问用户他们将事先输入什么数据类型。

C 输入 字符 计算器

评论

0赞 Lundin 11/14/2023
将输入扫描为字符串,解析字符串。 可能很方便。strtod
4赞 Harith 11/14/2023
读取字符串并将其与有效选项(“a”、“b”、“c”、...)进行比较。如果失败,请尝试将其解析为 .如果失败,请打印错误消息并退出程序。fgets()strtod()
0赞 Harith 11/14/2023
或者只是尝试将其解析为 ,如果失败,则将其视为字符。double
1赞 12431234123412341234123 11/14/2023
a b c d e 的字符是什么?这是变量吗?一个带有字符的字符串,一个写入了这个字符的输入文件?输入是什么意思?您是否从文件、IO 形式(如果您使用微控制器)、套接字、串行接口、TCP、GUI 等获取输入?"abcde"

答:

1赞 chux - Reinstate Monica 11/15/2023 #1

简单的方法是将一用户输入读取到字符串中,然后以多种方式解析字符串fgets()

用于记录扫描的偏移量(如果扫描到那么远),以检测成功并查找尾随垃圾。" %n"

允许前导和尾随空格。

// Read input as a,b,c,d,e or a float
// Return 2: if float
// Return 1: if char
// Return 0: neither
// Return EOF: end-of-file
int read_char_or_float(char *ch, float *f) {
  char buf[100];
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return EOF;
  }

  // Scan for white-space, one_a_to_e, white-space
  int n = 0;
  char s[2];
  sscanf(buf, " %1[a-e] %n", s, &n);
  if (n > 0 && buf[n] == '\0') {
    *ch = s[0];
    return 1;
  }

  // Scan for white-space, float, white-space
  n = 0;
  sscanf(buf, " %f %n", f, &n);
  if (n > 0 && buf[n] == '\0') {
    return 2;
  }

  return 0;
}

更好的代码将用于解析 ,但可以启动 OP。strtof()float

  errno = 0;
  char *endptr;
  *f = strtof(buf, &endptr);  
  if (endptr > buf && errno == 0) {
    while (isspace(*((unsigned char*)endptr))) {
      endptr++;
    }
    if (*endptr == '\0') {
      return 2;
    }
  }
  return 0;