当我编译下面在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;
}
答案 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;
}
请留下一些意见。