• C语言典型例题32


    《C程序设计教程(第四版)——谭浩强》


    习题2.9 编程序用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。

    (1)变量c1,c2应该定义为字符型或者整型吗?或者二者皆可?

    (2)要求输出变量的ASCLL码,应该怎么处理?用putchar函数还是printf()函数?

    (3)整型变量与字符变量是否在涉河情况下都可以相互替换呢?


    代码:

    1. //《C程序设计教程(第四版)——谭浩强》
    2. //习题2.9 编程序用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。
    3. #include <stdio.h>
    4. int main()
    5. {
    6. int c1 =getchar();
    7. int c2 =getchar();
    8. putchar(c1);
    9. putchar('\n');
    10. printf("%c\n",c2);
    11. return 0;
    12. }

    运行结果:


    (1)变量c1,c2应该定义为字符型或者整型吗?或者二者皆可?

    在 C 语言中,getchar函数返回的是一个int类型的值,表示读取到的字符的 ASCII 码。这个设计的原因是,getchar函数需要能够返回所有可能的字符值 (0 到 255) 以及额外的特殊值 EOF(表示文件结束或输入流的结束),因此它返回的是int类型。

    但在你的上下文中, 和 变量的类型可以有以下考量:c1c2

    1. 字符型 (char)

      • 如果我们只关心读取到的字符本身,并且确定不会直接处理 EOF,你可以将c1和c2定义为char类型。这样可以节省一些内存(虽然在实际应用中这微不足道)。

      然而,定义为char后你需要特别小心可能的 EOF 情况,因为如果发生 EOF,c1和c2的值可能会被当作正常的字符。这种情况下使用int类型在处理输入时就显得更为安全。

    2. 整型 (int)

      • 如果你将c1和c2定义为int类型,你可以直接存储getchar的返回值(包括正常的字符和 EOF 值)。这样处理起来会更安全,以避免因字符溢出而产生的不确定行为。

    (2)要求输出变量的ASCLL码,应该怎么处理?用putchar函数还是printf()函数?

    可以使用printf函数,因为它能够方便地格式化输出。尽管putchar函数可以输出字符,但它不适合直接输出一个字符对应的 ASCII 码。

    1. #include <stdio.h>
    2. int main()
    3. {
    4. // 提示用户输入两个字符
    5. printf("请输入两个字符(用回车分隔): \n");
    6. int c1 = getchar(); // 读取第一个字符
    7. getchar(); // 读取并忽略换行符
    8. int c2 = getchar(); // 读取第二个字符
    9. // 输出第一个字符及其 ASCII 码
    10. printf("第一个字符: '%c' 的 ASCII 码是: %d\n", c1, c1);
    11. // 输出第二个字符及其 ASCII 码
    12. printf("第二个字符: '%c' 的 ASCII 码是: %d\n", c2, c2);
    13. return 0;
    14. }

    (3)整型变量与字符变量是否在涉河情况下都可以相互替换呢?

    在 C 语言中,整型变量(如int )和字符变量(如 char)不可以在所有情况下直接相互替换,但在某些情况下可以更安全地操作。以下是一些详细的考虑:

    1. 字符与整型的关系

    • 字符类型 (char:通常用于存储单个字符。字符在内部是以其 ASCII 码表示的。
    • 整型类型 (int:用于存储整数值,包括较大的数值。由于int可以表示的范围更大,它可以安全地存储char类型的值。

    2. 相互转换

    • 隐式转换:在 C 中,char固定为整数类型的子集,因此所有char值都能被提升为int,但反过来就可能会出现问题,特别是涉及到范围的问题。

      • 例如, 然后声明 char ch = 'A';是合法的, int num = ch;的值将是 65(ASCII 码)。
    • 显式转换:也可以手动进行类型转换。

      1. char ch = 'A';
      2. int num = (int)ch; // 显式转换
    • 3. 使用getcharputchar

    • 使用getchar()函数读取字符时,它返回的是int类型,因此你可以安全地将读取的字符值存储在int变量中,也可以存储在char变量中,但是要注意,存储在char中后,如果读取的字符是 EOF,可能会引发问题。

    • putchar()函数需要一个int类型的参数,但它会将int转换为char返回给标准输出。你可以直接使用。​​​​​​​

    • 4. 风险

    • 数据丢失:如果一个char类型的值超出了int范围,尽管在现有情况下通常不太可能,但如果你尝试将一个不合法的char直接赋值给char类型的变量,可能会引发数据丢失。

    • EOF 和无效值:如果你用getchar()函数来读取字符并将其存储在 类型中,一旦读取到 EOF(通常是 -1),可能会因为char类型无法表示负值而导致问题。

  • 相关阅读:
    FTP 基础 与 使用 Docker 搭建 Vsftpd 的 FTP 服务
    GitHub 毕业年鉴「GitHub 热点速览 v.22.20」
    Visio 安装暴雷记录
    护网IP去重,去白名单
    mysql 连接不上,start the server错误,服务启动停止,怎么都连不上。
    RK3588平台开发系列讲解(Thermal篇)Thermal介绍及用法
    智能运维应用之道,告别企业数字化转型危机
    【操作系统】总结 (一) 机组部分知识
    官宣!Sam Altman加入微软,OpenAI临时CEO曝光,回顾董事会‘’政变‘’始末
    Angular:升级Angular 13到Angular 14
  • 原文地址:https://blog.csdn.net/2302_77517102/article/details/141097792