鱼C论坛

 找回密码
 立即注册
查看: 1725|回复: 3

[已解决]第24课动手第0题关于数据类型

[复制链接]
发表于 2019-3-29 18:57:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        int matrix[3][3] = {0};
        int i, j;

        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 3; j++)
                {
                        matrix[i][j] = getchar();
                }
        }

        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 3; j++)
                {
                        printf("%c ", matrix[i][j]);
                }
                printf("\n");
        }


        return 0;
}

问题1:
定义 matrix 时用的 int ,说明数据是整形的
为什么 printf 输出时,用的是字符型而不是整型?
虽然用整型的话会输出错误的数值,但是为什么错并没有明白

问题2:
我个人一开始的思路是需要用一个scanf的函数来读取输入数据的
但不用scanf也能实现功能,为什么不需要scanf呢?
最佳答案
2019-3-29 19:19:21
本帖最后由 jackz007 于 2019-3-29 19:36 编辑

     1、在 C / C++ 语言中,每个字符都是通过编码进行表示的,也就是说,整形数与字符之间是存在联系的。例如,整数 65 是字符 'A' 的编码,97 是字符 'a' 的编码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
        int c1 , c2                   ;
        c1 = 65                       ;
        c2 = 97                       ;
        printf("%c , %c\n" , c1 , c2) ; // 屏幕输出 A , a
}
    这 2 个整数如果按 '%c' 显示,看到的就是字母,如果按 '%d' 显示,看到的就是整数。

    2、scanf() 与 getchar() 显然功能不同,用途也不同,scanf() 根据需要,可以从键盘输入整数、浮点数、字符、字符串等,而且,可以同时接受多个变量输入,在实践中使用比较广泛;getchar() 只能接受单字符输入,一般用于在程序中设置按一个键继续的功能,很少用于实质性的信息获取。使用 getchar() 接受信息有个问题,就是按下字符键还得按下回车键才能完成输入,这样,需要用两个 getchar() 指令才能把键入的内容完整接收, 第一次取到字符,第二次取到回车符。所以,在编程中一定要引起特别的注意。在本例中,楼主的代码在每次循环中,只设计了一个 getchar(),如果本次取到字符,那么,在下次循环中,取到的将是回车符,这肯定不是楼主所愿的。

        所以,正确的做法是设置双 getchar() ,丢弃不希望的回车符,就像下面这样:
        for (i = 0 ; i < 3 ; i ++) {
                for (j = 0 ; j < 3 ; j ++) {
                        matrix[i][j] = getchar();
                        getchar()               ;
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-29 19:19:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-3-29 19:36 编辑

     1、在 C / C++ 语言中,每个字符都是通过编码进行表示的,也就是说,整形数与字符之间是存在联系的。例如,整数 65 是字符 'A' 的编码,97 是字符 'a' 的编码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
        int c1 , c2                   ;
        c1 = 65                       ;
        c2 = 97                       ;
        printf("%c , %c\n" , c1 , c2) ; // 屏幕输出 A , a
}
    这 2 个整数如果按 '%c' 显示,看到的就是字母,如果按 '%d' 显示,看到的就是整数。

    2、scanf() 与 getchar() 显然功能不同,用途也不同,scanf() 根据需要,可以从键盘输入整数、浮点数、字符、字符串等,而且,可以同时接受多个变量输入,在实践中使用比较广泛;getchar() 只能接受单字符输入,一般用于在程序中设置按一个键继续的功能,很少用于实质性的信息获取。使用 getchar() 接受信息有个问题,就是按下字符键还得按下回车键才能完成输入,这样,需要用两个 getchar() 指令才能把键入的内容完整接收, 第一次取到字符,第二次取到回车符。所以,在编程中一定要引起特别的注意。在本例中,楼主的代码在每次循环中,只设计了一个 getchar(),如果本次取到字符,那么,在下次循环中,取到的将是回车符,这肯定不是楼主所愿的。

        所以,正确的做法是设置双 getchar() ,丢弃不希望的回车符,就像下面这样:
        for (i = 0 ; i < 3 ; i ++) {
                for (j = 0 ; j < 3 ; j ++) {
                        matrix[i][j] = getchar();
                        getchar()               ;
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-29 20:32:01 | 显示全部楼层
jackz007 发表于 2019-3-29 19:19
1、在 C / C++ 语言中,每个字符都是通过编码进行表示的,也就是说,整形数与字符之间是存在联系的。 ...

字符通过编码表示我是知道的
是我问题问的不够详细,上串的代码执行以后,输入9个数字是能实现功能的(9个数字按照3x3的矩阵排列)。但是如果把%c  换成 %d 却输出不了输入的9个数字,按照道理输入是9个数字的话,不应该是用%d来输出吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-29 20:51:11 | 显示全部楼层
问题1:
计算机中存放的都是2进制,这点你同意不?字符 'a' ascii 就是整型的 97对吧,最终都是2进制。那么你要定义int也好char也好也没有问题对不对。既然是编程,那么就是灵活的;你觉得怎么方便你就怎么写。

97 %c 输出 不就是'a' 了。

问题2:
scanf getchar 还是那句话。既然是编程,那么就是灵活的;你觉得怎么方便你就怎么写。
哪个函数用起来方便就用哪个。
不要问别人为什么不用。你倒是可以发表自己的看法,比如“我觉得scanf 在这里用起来比 getchar好,”再加上具体好在哪里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 12:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表