getchar()或getche()输入字符的问题

时间:2010-08-12 07:26:48

标签: c

当我编译下面在Borland C ++ v5.02中编写的C代码(来自自学C,第2版-Herbert Schildt )时,我收到如下警告信息: “c61.c(7,6):转换可能会失去有效数字”

怎么了?

#include "stdio.h"

main()
{
 char ch;
 ch = getchar();
 printf(" You typed: %c", ch);

 return 0;
}

另一个例子的相同问题:

#include "conio.h"
#include "stdio.h"

main()
{
 char ch;

 printf("Enter a character: ");
 ch = getche();
 printf("\nIts ASCII code is %d", ch);

 return 0;
}

3 个答案:

答案 0 :(得分:6)

getchar()返回一个int,因此它可以返回非字符值,如EOF。因此,当您将返回值存储在较小的数据类型(如char)中时,可能会丢失信息。

Schildt的书籍通常被认为是学习C(或C ++)最糟糕的书籍,这是一个很好的例子。建议您购买更好的书,例如K& R.

答案 1 :(得分:2)

getchar的原型是:

int getchar (void);

它返回int,因为它需要返回不是字符的EOF。


扩展此功能,该函数需要能够返回任何有效字符,并且能够返回一个特殊的“字符”,表示您已到达文件末尾(或发生了错误。)

由于char数据类型只能包含其中一个字符,因此如果返回的所有函数都是char,则无法指示此文件结尾。这是因为,如果您选择其中一个char值来表示文件结尾,则无法区分文件末尾与实际字符之间的区别。

例如,让我们选择“A”来表示文件结尾。当您从getchar()实际取回“A”时,您如何知道自己是否已到达文件末尾或用户是否确实输入了“A”?

为了解决这个问题,许多回复char的函数实际上会给你int并使用其中一个没有实际char等效值的整数值(例如-1)。

在这种情况下(假设为8位char),如果到达文件末尾,则返回-1,或者表示输入字符的0到255之间的值。


你需要让自己成为一本更现代的书更现代的编译器:

#include <stdio.h>
int main (void) {
    int ch = getchar();
    if (ch != EOF)
        printf("You typed: %c\n", ch);
    return 0;
}

为什么有人仍在使用Borland这个时代(gcc既便宜又很多更好)超出了我。

答案 2 :(得分:0)

这个替代计划怎么样?它工作正常。

#include <stdio.h>

main()
{
 char ch;

 getchar();

 printf("Enter the character: ");
 scanf("%c", &ch);
 printf(" You typed: %c\n", ch);
 return 0;
}

请留下一些意见。