《C程序设计教程(第四版)——谭浩强》
习题2.9 编程序用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。
(1)变量c1,c2应该定义为字符型或者整型吗?或者二者皆可?
(2)要求输出变量的ASCLL码,应该怎么处理?用putchar函数还是printf()函数?
(3)整型变量与字符变量是否在涉河情况下都可以相互替换呢?
代码:
//《C程序设计教程(第四版)——谭浩强》
//习题2.9 编程序用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。
#include <stdio.h>int main()
{int c1 =getchar();int c2 =getchar();putchar(c1);putchar('\n');printf("%c\n",c2);return 0;
}
运行结果:
(1)变量c1,c2应该定义为字符型或者整型吗?或者二者皆可?
在 C 语言中,getchar函数返回的是一个int类型的值,表示读取到的字符的 ASCII 码。这个设计的原因是,getchar函数需要能够返回所有可能的字符值 (0 到 255) 以及额外的特殊值 EOF(表示文件结束或输入流的结束),因此它返回的是int类型。
但在你的上下文中, 和 变量的类型可以有以下考量:
c1
c2
字符型 (
char
):
- 如果我们只关心读取到的字符本身,并且确定不会直接处理 EOF,你可以将c1和c2定义为char类型。这样可以节省一些内存(虽然在实际应用中这微不足道)。
然而,定义为char后你需要特别小心可能的 EOF 情况,因为如果发生 EOF,c1和c2的值可能会被当作正常的字符。这种情况下使用int类型在处理输入时就显得更为安全。
整型 (
int
):
- 如果你将c1和c2定义为int类型,你可以直接存储getchar的返回值(包括正常的字符和 EOF 值)。这样处理起来会更安全,以避免因字符溢出而产生的不确定行为。
(2)要求输出变量的ASCLL码,应该怎么处理?用putchar函数还是printf()函数?
可以使用printf函数,因为它能够方便地格式化输出。尽管putchar函数可以输出字符,但它不适合直接输出一个字符对应的 ASCII 码。
#include <stdio.h>int main()
{
// 提示用户输入两个字符
printf("请输入两个字符(用回车分隔): \n");int c1 = getchar(); // 读取第一个字符
getchar(); // 读取并忽略换行符
int c2 = getchar(); // 读取第二个字符// 输出第一个字符及其 ASCII 码
printf("第一个字符: '%c' 的 ASCII 码是: %d\n", c1, c1);
// 输出第二个字符及其 ASCII 码
printf("第二个字符: '%c' 的 ASCII 码是: %d\n", c2, c2);return 0;
}
(3)整型变量与字符变量是否在涉河情况下都可以相互替换呢?
在 C 语言中,整型变量(如int )和字符变量(如 char)不可以在所有情况下直接相互替换,但在某些情况下可以更安全地操作。以下是一些详细的考虑:
1. 字符与整型的关系
- 字符类型 (
char
):通常用于存储单个字符。字符在内部是以其 ASCII 码表示的。- 整型类型 (
int
):用于存储整数值,包括较大的数值。由于int可以表示的范围更大,它可以安全地存储char类型的值。2. 相互转换
隐式转换:在 C 中,char固定为整数类型的子集,因此所有char值都能被提升为int,但反过来就可能会出现问题,特别是涉及到范围的问题。
- 例如, 然后声明
char ch = 'A';
是合法的,int num = ch;
的值将是65
(ASCII 码)。显式转换:也可以手动进行类型转换。
char ch = 'A'; int num = (int)ch; // 显式转换
3. 使用
getchar
和putchar
使用
getchar()
函数读取字符时,它返回的是int
类型,因此你可以安全地将读取的字符值存储在int
变量中,也可以存储在char
变量中,但是要注意,存储在char
中后,如果读取的字符是 EOF,可能会引发问题。
putchar()
函数需要一个int
类型的参数,但它会将int
转换为char
返回给标准输出。你可以直接使用。4. 风险
数据丢失:如果一个
char
类型的值超出了int范围,尽管在现有情况下通常不太可能,但如果你尝试将一个不合法的char
直接赋值给char
类型的变量,可能会引发数据丢失。EOF 和无效值:如果你用
getchar()
函数来读取字符并将其存储在 类型中,一旦读取到 EOF(通常是 -1),可能会因为char类型无法表示负值而导致问题。