鱼C论坛

 找回密码
 立即注册
楼主: 竹逸

[已解决]关于scanf函数,我这么理解对吗?

[复制链接]
发表于 2022-8-18 17:54:31 | 显示全部楼层
竹逸 发表于 2022-8-18 17:49
好,既然是以字符形式存在,那我连续输入的1234,就是一个个单独的字符‘1’‘2’‘3’‘4’是吗?为什 ...

什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-18 23:40:39 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-8-18 23:54 编辑
人造人 发表于 2022-8-18 17:54
什么?


既然每按一次键都是以字符ASCII码值的形式存入在输入流中的,那当我按下数字键1时,就代表着输入流中有字符1对应的ASCII码(二进制存储,十进制是49),疑惑的是计算机从输入流中读取了这个字符1的ASCII码值49,当我们以%d类型输入时,它是如何把49给转换成 数字1 的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 07:49:59 | 显示全部楼层
竹逸 发表于 2022-8-18 23:40
既然每按一次键都是以字符ASCII码值的形式存入在输入流中的,那当我按下数字键1时,就代表着输入流中有 ...

类似这样
#include <stdio.h>

int main(void) {
    int result = 0;
    while(1) {
        int ch = getchar();
        if(ch < '0' || ch > '9') {
            ungetc(ch, stdin);
            break;
        }
        result = result * 10 + (ch - '0');
    }
    printf("%d\n", result);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 08:00:31 | 显示全部楼层
#include <stdio.h>

int atoi_(const char *str) {
    int result = 0;
    for(size_t i = 0; str[i]; ++i) {
        if(str[i] < '0' || str[i] > '9') {
            break;
        }
        result = result * 10 + (str[i] - '0');
    }
    return result;
}

int main(void) {
    {
        int result = 0;
        while(1) {
            int ch = getchar();
            if(ch < '0' || ch > '9') {
                ungetc(ch, stdin);
                break;
            }
            result = result * 10 + (ch - '0');
        }
        printf("%d\n", result);
    }
    {
        printf("%d\n", atoi_("123ab"));
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 08:59:36 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-8-19 07:49
类似这样

原来是这样的

那这句result = result * 10 + (ch - '0'); 里的 result * 10 是不是没有发挥用处?直接 result = rch - '0' 这样不可以么?

我怀疑计算机内部是不是有一张字符常量表,定义了字符‘0’~‘9’的常量值是1~9,当我们输入这些数字字符时并设定为%d时,就直接用常量值替换,这样感觉就不用每按一个键都得计算一次?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 09:12:01 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-8-19 09:27 编辑
人造人 发表于 2022-8-19 07:49
类似这样


既然是这样被转换成整形的,那如果我输入123呢,输入流中的字符1,字符2,字符3,被cpu读取转换成整形1,整形2,整形3后,计算机是又如何确定他们各自的权重的?

比如我输入的123要的是一百二十三这个整数,而不是1,2,3三个整数,计算机内部难道会记录我键下的次数?然后把这个次数值当成各数字的权,再 "按权相加"
组成用户完整的整形数据,或者就直接是左移操作?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 09:54:47 | 显示全部楼层
竹逸 发表于 2022-8-19 09:12
既然是这样被转换成整形的,那如果我输入123呢,输入流中的字符1,字符2,字符3,被cpu读取转换成整形1 ...

这个程序你运行过吗?
直接 result = rch - '0' 这样不可以么?
你试一试看可不可以

调试一下这行代码,弄清楚这行代码是如何把字符组装成数字的
result = result * 10 + (ch - '0');
#include <stdio.h>

int atoi_(const char *str) {
    int result = 0;
    for(size_t i = 0; str[i]; ++i) {
        if(str[i] < '0' || str[i] > '9') {
            break;
        }
        result = result * 10 + (str[i] - '0');
    }
    return result;
}

int main(void) {
    {
        int result = 0;
        while(1) {
            int ch = getchar();
            if(ch < '0' || ch > '9') {
                ungetc(ch, stdin);
                break;
            }
            result = result * 10 + (ch - '0');
        }
        printf("%d\n", result);
    }
    {
        printf("%d\n", atoi_("123ab"));
    }
    return 0;
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竹逸 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 10:00:12 | 显示全部楼层
竹逸 发表于 2022-8-19 09:12
既然是这样被转换成整形的,那如果我输入123呢,输入流中的字符1,字符2,字符3,被cpu读取转换成整形1 ...

在二进制中,乘以2就是左移一位数字,对吗?
在十进制中,乘以10就是左移一位数字,对吗?
在十六进制中,乘以16就是左移一位数字,对吗?

所以这里为什么要乘以10呢?调试一下这行代码呀
反汇编看一下这行代码是怎么用cpu指令完成的
调试程序,看一看这行代码如何把数字一步一步的组装起来
result = result * 10 + (ch - '0');
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 11:48:03 | 显示全部楼层
人造人 发表于 2022-8-19 09:54
这个程序你运行过吗?
直接 result = rch - '0' 这样不可以么?
你试一试看可不可以

你这代码确实运行不了

比如:

for(size_t i = 0; str[i]; ++i)

红标的是什么数据类型?

还有,你的result初始化值是0,result * 10 + (str[i] - '0'); 这用0*10的意义在哪里?你这个result 变量应该是记录字符的个数吧?

还有你的 int main(void) {{  ,为啥main函数有两个左大括号?你这编译器真的行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 12:13:55 | 显示全部楼层
本帖最后由 竹逸 于 2022-8-19 13:10 编辑
人造人 发表于 2022-8-19 09:54
这个程序你运行过吗?
直接 result = rch - '0' 这样不可以么?
你试一试看可不可以


你这代码我这样改行不行,我还没学到数组哪里,还不清楚声明一个数组的方式对不对
#include<stdio.h>
#include<math.h>

int main(void)
{
        int result = 0, sum = 0, i = 0;
        char str[3];
        char temp;
        
        while((temp = getchar()) != '\n')
        {
                str[result++] = temp;
        }

        
        for(; i<result; i++)
        {
                sum += pow(10,--result) * (str[i] - '0');
    }
    printf("%d", sum);
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:21:19 | 显示全部楼层
竹逸 发表于 2022-8-19 11:48
你这代码确实运行不了

比如:

换新版本的编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:21:51 | 显示全部楼层
竹逸 发表于 2022-8-19 12:13
你这代码我这样改行不行,我还没学到数组哪里,还不清楚声明一个数组的方式对不对

不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:29:54 | 显示全部楼层
竹逸 发表于 2022-8-19 12:24
我重新改了下,思路应该就是这样的,不知道怎么声明一个动态的数组,就是不确定数组元素的个数。

不对,C语言中的 ^ 是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 12:31:03 | 显示全部楼层
本帖最后由 竹逸 于 2022-8-19 13:11 编辑
人造人 发表于 2022-8-19 12:29
不对,C语言中的 ^ 是什么?


我忘记用pow()函数了,是求平方的,重新改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:38:14 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:42:24 | 显示全部楼层
#include <stdio.h>
#include <math.h>

int main(void) {
    int result = 0, sum = 0;
    char str[3]; //比如我输入123,按了3次键
    char temp;

    while((temp = getchar()) != '\n') {
        // str[++result] = temp; ???
        str[result++] = temp;
    }

    for(int i = 0; i < result; i++) {
        // sum += pow(10,--result) * (str[i] - '0');
        sum += pow(10, result - i - 1) * (str[i] - '0');
    }
    // printf("%d", sum); // 为什么就是不愿意换上一行?
    printf("%d\n", sum);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 12:43:44 | 显示全部楼层
竹逸 发表于 2022-8-19 12:24
我重新改了下,思路应该就是这样的,不知道怎么声明一个动态的数组,就是不确定数组元素的个数。

不知道怎么声明一个动态的数组,就是不确定数组元素的个数
这个教程中有讲过的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 12:56:14 | 显示全部楼层
本帖最后由 竹逸 于 2022-8-19 12:57 编辑


我再重新修改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-19 13:04:57 | 显示全部楼层
本帖最后由 竹逸 于 2022-8-19 13:21 编辑
人造人 发表于 2022-8-19 12:43
不知道怎么声明一个动态的数组,就是不确定数组元素的个数
这个教程中有讲过的


现在绝对没问题了,你运行一下试试,只能输入3个数字,旧版本的课件关于数组和字符串的那节课还没学过
#include<stdio.h>
#include<math.h>

void main()
{
        int result = 0, sum = 0, i = 0, j;
        char str[3];                  //输入3个数字后回车
        char temp;
        
        while((temp = getchar()) != '\n')
        {
                str[result++] = temp;   
        }

        j = result;

        for(; i<j; i++, result--)
        {
                sum += pow(10,result-1) * (str[i] - '0');
    }
    printf("%d\n", sum);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-19 13:31:01 | 显示全部楼层
竹逸 发表于 2022-8-19 13:04
现在绝对没问题了,你运行一下试试,只能输入3个数字,旧版本的课件关于数组和字符串的那节课还没学过
...

没问题了
但是这一行代码多好
result = result * 10 + (ch - '0');
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 09:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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