【问题标题】:C converting char to intC将char转换为int
【发布时间】:2015-01-29 15:42:29
【问题描述】:

我正在尝试用 C 语言构建一个程序:

  1. 获取用户年龄
  2. 检查年龄是否在 18 到 120 岁之间
  3. 检查年龄是否不包含其他字符,例如字母、点等。
  4. 如果不在 18-120 之间或包含其他字符,请返回第 1 部分。

要检查数字 3,我认为我需要将用户的年龄扫描为 char,但我无法检查它是否在 18 到 120 之间。我不能使用数组或字符串。这是我现在拥有的代码,用于检查代码不包含其他字符:

void main() {
char age;
int error = 0;
do
{
    error = 0;
    printf("Please enter your age:");
    scanf("%c", &name);
    while (name != '\n')
    {
        if ((name<'0') || (name>'9')){
            error++;
        }
        name = getchar();
    }
} while (error != 0);
}  

【问题讨论】:

  • 不错的作业:D自己做! (如果不是功课,你就没有付出努力)
  • 不清楚你是否在第 1 步成功了。也许你应该展示你到目前为止所做的事情。
  • 得到一个char数组(C风格的字符串),然后用strtol转换成数字。作为奖励,strtol 会给你一个指向它找到的任何非法字符的指针。
  • 在步骤 2 之前执行步骤 3 是有意义的。
  • 正如我所说,不能使用数组或字符串,我知道如何单独检查 2 和 3,但不能一起检查:如果我将 age 定义为 int,我可以检查 2,如果我定义作为一个字符的年龄我可以检查 3. 但我该如何做呢?

标签: c loops char scanf getchar


【解决方案1】:

将年龄和输入保存在单独的变量中,例如 agech
在读取每个ch 时,测试EOF'\n' 是否为数字。 OP 的代码已经完成了一些工作。
如果过了,就累积年龄。测试最大值 (120)。这也将检测溢出。
处理完输入行后,检查最小值 (18)。

#include <ctype.h>
#include <stdio.h>

int main(void) {
  int error;
  int ch;
  do {
    int age = 0;
    error = 0;
    printf("Please enter your age:");
    fflush(stdout);
    while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
      // Maybe also throw out white-space
      if (isspace(ch))
        continue;
      // or if (!isdigit(ch)) {
      if ((ch < '0') || (ch > '9')) {
        error = 1;
      } else {
        age = age * 10 + ch - '0';
        if (age > 120)
          error = 2;
      }
    }
    if (age < 18)
      error = 3;
    printf("Age: %d Error: %d\n", age, error);
  } while (error && ch != EOF);
  return 0;
}

Important to use int ch rather than char ch.

次要位: 使用正确的签名。示例:

 // void main()
 int main(void)

当使用scan() 时,总是检查返回值。 在这种情况下,代码可以简单地使用fgetc()getchar()

发布的代码无法编译。 (name 未定义。) 除非您遇到编译问题,否则请始终发布可编译的代码。

【讨论】:

    【解决方案2】:

    你应该使用long int strtol(const char *nptr, char **endptr, int base)函数,阅读手册。

    【讨论】:

    • 或者他可以使用 atoi(const char *str);
    • 这样他将无法检查转换失败的原因。如果他想知道字符串中是否存在其他字符,这是一个很好的解决方案。
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多