【问题标题】:How to use isdigit function in C如何在 C 中使用 isdigit 函数
【发布时间】:2020-06-30 16:38:39
【问题描述】:

我是一个完整的 cs50 课程初学者,我需要检查用户的参数是否为数字。

这是代码:

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

int main(void)
{
  int i = 1;
  if (isdigit(i) == 1)
    {
      printf("i is a digit");
    }
  else if (isdigit(i) == 0)
    {
      printf("i is not a digit");
    }
return 0;
}

当我运行这段代码时,我基本上得到了我应该得到的相反结果。当 i 是一个数字时,它会打印出“i is not a number”,反之亦然。 我究竟做错了什么?我认为 isdigit 如果是数字则返回非零值,否则返回 0。基本上1为真,0为假。这不正确吗? 非常感谢,谢谢!

【问题讨论】:

  • 也许一些文档会有所帮助:isdigit

标签: c function cs50


【解决方案1】:

我做错了什么?

“isdigit 函数测试任何十进制数字字符”。 为 1 的i 不是数字字符。

试试i = '1';。那么i就会有一个数字字符的值。

代码正在错误地测试返回值。 @tadmanis...() 返回 0 或非零。

// if (isdigit(i) == 1)
if (isdigit(i))

注意:is...(int ch) 函数仅对unsigned char 范围内的chEOF 有效。

【讨论】:

  • 哦,我明白了,非常感谢,我真的被困了好几天哈哈!
  • @UKushi isstuck(U_Kushi("2020/06/30")) --&gt; false
【解决方案2】:

如果您阅读the documentation for isdigit(),您会注意到返回值表示为:

如果字符是数字字符,则为非零值,否则为零。

换句话说,不要与一个确切的比较,这不能保证。与非零比较。

话虽如此,这适用于字符而不是整数,尽管在​​C语言中这条线是模糊的。您想要的是确保这是字符串的一部分,例如:

char* n = "12345";

if (isdigit(n[0]) == 0) {
  ...
}

在您的情况下,您是在询问 ASCII 字符 1 是否是数字,而事实并非如此。那是“标题开始”(SOH) 控制字符。

【讨论】:

  • 明白了,谢谢!基本上我试图确保 argv[1][i] 都是数字
  • 如果这是您的最终目标,可以使用answer for that
【解决方案3】:

isdigit 是一个character classification 函数。

根据字符(或者更确切地说,字符promotedint)是否为数字,它将返回零或非零。

例如:

int i = '1';  // Initialize to the character '1'
if (isdigit(i))
  {
    printf("i is a digit");
  }
else
  {
    printf("i is not a digit");
  }

注意isdigit 为数字字符返回一个非零 值,它不必是1

【讨论】:

    【解决方案4】:

    isdigit 的参数应该是单个字符,而不是数字。因此,您的测试代码应该更正确

    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
      {
      char c = '1';
    
      if(isdigit(c))
        printf("c is a digit");
      else
        printf("c is not a digit");
    
      return 0;
      }
    

    【讨论】:

      【解决方案5】:

      您的代码应遵守函数的定义,如果返回值是数字,则不要对返回值做出假设 - 实际返回值可能取决于实现,这是一种更好的 C 风格,尽管正如其他人所说,你应该传入一个 char,而不是 int - 编译器没有抱怨吗?

      if (isdigit(i)) {
        printf("i is a digit");
      } else {
        printf("i is not a digit");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2020-08-24
        • 2023-03-16
        • 2018-02-22
        相关资源
        最近更新 更多