【问题标题】:How to check int or char in c如何在c中检查int或char
【发布时间】:2019-09-21 14:00:39
【问题描述】:

我有一个将摄氏度转换为华氏度的代码。我需要检查用户写的是什么字符或整数。

我尝试过 isalpha 和 isdigit,但它们不起作用。

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

int main()
{
    char t[] = "";
    scanf("%s", &t);
    if(isalpha(t))
    {
        printf("It's char\n");
    }
    else if (isdigit(t))
    {
        printf("It's int\n");
    }


    return 0;
}

【问题讨论】:

  • 他们怎么不工作?您需要edit 并澄清。
  • 您忽略了 scanf() 的返回值,风险自负。 sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
  • scanf() 中的t 之前不需要&amp;。数组在参数列表中使用时会自动衰减为指针。
  • @Yunnosch :总体来说很好,但可能没有遇到 EOF,任何输入都可以使用%s 成功转换,因为它不是特定的内容。当然,字符串很可能是空的。
  • @Clifford 你是对的。但是您不会认真地相信这就是为什么 OP 在这种情况下会忽略返回值,对吗?任何忽视它的人都应该得到他们得到的所有奇怪行为。总是,即使原因无关。那些知道不要忽视它的人,请在极少数情况下发送(void),他们这样做是有充分理由的。

标签: c char scanf digits isalpha


【解决方案1】:

isalphaisdigit 应用于包含 char 的 int 类型的对象。

您正在尝试将这些函数应用于 char * 类型的对象(数组类型在表达式中隐式转换为指针类型)。

此外,数组t 声明为

char t[] = "";

甚至不足以存储从 scanf 获得的一个字符,因为它还需要存储终止零。否则 scanf 的调用将具有未定义的行为。而且scanf的调用也不正确。

scanf("%s", &t);
            ^^^

至少应该写成这样

scanf("%s", t);

你可以声明一个 char 类型的对象

char t;

然后像scanf一样使用

scanf(" %c", &t);

最后

if ( isalpha( ( unsigned char )t ) )
{
    printf("It's char\n");
}
else if ( isdigit( ( unsigned char )t ) )
{
    printf("It's int\n");
}

【讨论】:

  • 我担心t&amp;t 虽然输入错误,但无论如何都会指向同一个地方。 scanf() 没有在参数列表中接收任何类型信息,因此,尽管从强类型语言的角度来看是不正确的,但该代码可以正常工作。
【解决方案2】:

首先:

char t[] = "";

创建一个只有一个字符的缓冲区,然后

scanf("%s", t);

除了空字符串输入之外的任何内容都会超出该缓冲区。让scanf() 避免溢出并不简单,但即便如此,大多数天真的实现也会有一个实用的缓冲区长度,例如;

char t[128] = "" ;

如果期望输入一个可以转换为int 的字符串,那么对于所有 32 位整数来说,10 位十进制数字就足够了。

scanf("%10s", t);

charint 是数据类型,这里用户只输入一个字符串。您的问题实际上是用户是否输入了可能被解释为整数的内容。

isalpha()isdigit() 对单个字符进行操作,但 t 是一个字符串。

下面会检查字符串t的第一个字符:

if( isdigit(t[0]) )
{
    printf("It's digit\n");
}
else
{
    printf("It's not a digit\n");
}

请注意,对 isalpha() 进行测试毫无意义,因为所有数字 + 所有 alpha 的并集仍然只是所有字符的子集。

如果实际上您只是想验证整个字符串是否为数字,那么:

for( int i = 0; t[i] != 0 && isdigit(t[i]) i++ )
{
    // nothing
} 

if( t[i] == 0 )
{
     printf("It's numeric\n");
}
else
{
     printf("It's not entirely numeric\n");
}

即使这样,数字字符串也不能用int 表示;它也必须在范围内。您可能还想考虑在开头使用 -/+ 符号的可能性,并可能考虑忽略尾随的非数字数字。

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 2018-06-20
    • 2021-03-15
    • 2017-06-21
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多