人造人
发表于 2022-8-18 17:54:31
竹逸 发表于 2022-8-18 17:49
好,既然是以字符形式存在,那我连续输入的1234,就是一个个单独的字符‘1’‘2’‘3’‘4’是吗?为什 ...
什么?
竹逸
发表于 2022-8-18 23:40:39
本帖最后由 竹逸 于 2022-8-18 23:54 编辑
人造人 发表于 2022-8-18 17:54
什么?
既然每按一次键都是以字符ASCII码值的形式存入在输入流中的,那当我按下数字键1时,就代表着输入流中有字符1对应的ASCII码(二进制存储,十进制是49),疑惑的是计算机从输入流中读取了这个字符1的ASCII码值49,当我们以%d类型输入时,它是如何把49给转换成 数字1 的?{:10_245:}
人造人
发表于 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;
}
人造人
发表于 2022-8-19 08:00:31
#include <stdio.h>
int atoi_(const char *str) {
int result = 0;
for(size_t i = 0; str; ++i) {
if(str < '0' || str > '9') {
break;
}
result = result * 10 + (str - '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;
}
竹逸
发表于 2022-8-19 08:59:36
人造人 发表于 2022-8-19 07:49
类似这样
原来是这样的
那这句result = result * 10 + (ch - '0'); 里的 result * 10 是不是没有发挥用处{:10_245:}?直接 result = rch - '0' 这样不可以么?
我怀疑计算机内部是不是有一张字符常量表,定义了字符‘0’~‘9’的常量值是1~9,当我们输入这些数字字符时并设定为%d时,就直接用常量值替换,这样感觉就不用每按一个键都得计算一次?
竹逸
发表于 2022-8-19 09:12:01
本帖最后由 竹逸 于 2022-8-19 09:27 编辑
人造人 发表于 2022-8-19 07:49
类似这样
既然是这样被转换成整形的,那如果我输入123呢,输入流中的字符1,字符2,字符3,被cpu读取转换成整形1,整形2,整形3后,计算机是又如何确定他们各自的权重的?
比如我输入的123要的是一百二十三这个整数,而不是1,2,3三个整数,计算机内部难道会记录我键下的次数?然后把这个次数值当成各数字的权,再 "按权相加"
组成用户完整的整形数据,或者就直接是左移操作?
人造人
发表于 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) {
if(str < '0' || str > '9') {
break;
}
result = result * 10 + (str - '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;
}
人造人
发表于 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');
竹逸
发表于 2022-8-19 11:48:03
人造人 发表于 2022-8-19 09:54
这个程序你运行过吗?
直接 result = rch - '0' 这样不可以么?
你试一试看可不可以
你这代码确实运行不了
比如:
for(size_t i = 0; str; ++i)
红标的是什么数据类型?
还有,你的result初始化值是0,result * 10 + (str - '0'); 这用0*10的意义在哪里?你这个result 变量应该是记录字符的个数吧?
还有你的 int main(void) {{,为啥main函数有两个左大括号?你这编译器真的行?{:5_94:}
竹逸
发表于 2022-8-19 12:13:55
本帖最后由 竹逸 于 2022-8-19 13:10 编辑
人造人 发表于 2022-8-19 09:54
这个程序你运行过吗?
直接 result = rch - '0' 这样不可以么?
你试一试看可不可以
你这代码我这样改行不行,我还没学到数组哪里,还不清楚声明一个数组的方式对不对{:5_92:}
#include<stdio.h>
#include<math.h>
int main(void)
{
int result = 0, sum = 0, i = 0;
char str;
char temp;
while((temp = getchar()) != '\n')
{
str = temp;
}
for(; i<result; i++)
{
sum += pow(10,--result) * (str - '0');
}
printf("%d", sum);
return 0;
}
人造人
发表于 2022-8-19 12:21:19
竹逸 发表于 2022-8-19 11:48
你这代码确实运行不了
比如:
换新版本的编译器
人造人
发表于 2022-8-19 12:21:51
竹逸 发表于 2022-8-19 12:13
你这代码我这样改行不行,我还没学到数组哪里,还不清楚声明一个数组的方式对不对
不对
人造人
发表于 2022-8-19 12:29:54
竹逸 发表于 2022-8-19 12:24
我重新改了下,思路应该就是这样的,不知道怎么声明一个动态的数组,就是不确定数组元素的个数。
不对,C语言中的 ^ 是什么?
竹逸
发表于 2022-8-19 12:31:03
本帖最后由 竹逸 于 2022-8-19 13:11 编辑
人造人 发表于 2022-8-19 12:29
不对,C语言中的 ^ 是什么?
我忘记用pow()函数了,是求平方的,重新改下
人造人
发表于 2022-8-19 12:38:14
人造人
发表于 2022-8-19 12:42:24
#include <stdio.h>
#include <math.h>
int main(void) {
int result = 0, sum = 0;
char str; //比如我输入123,按了3次键
char temp;
while((temp = getchar()) != '\n') {
// str[++result] = temp; ???
str = temp;
}
for(int i = 0; i < result; i++) {
// sum += pow(10,--result) * (str - '0');
sum += pow(10, result - i - 1) * (str - '0');
}
// printf("%d", sum); // 为什么就是不愿意换上一行?
printf("%d\n", sum);
return 0;
}
人造人
发表于 2022-8-19 12:43:44
竹逸 发表于 2022-8-19 12:24
我重新改了下,思路应该就是这样的,不知道怎么声明一个动态的数组,就是不确定数组元素的个数。
不知道怎么声明一个动态的数组,就是不确定数组元素的个数
这个教程中有讲过的
竹逸
发表于 2022-8-19 12:56:14
本帖最后由 竹逸 于 2022-8-19 12:57 编辑
人造人 发表于 2022-8-19 12:38
我再重新修改下
竹逸
发表于 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个数字后回车
char temp;
while((temp = getchar()) != '\n')
{
str = temp;
}
j = result;
for(; i<j; i++, result--)
{
sum += pow(10,result-1) * (str - '0');
}
printf("%d\n", sum);
}
人造人
发表于 2022-8-19 13:31:01
竹逸 发表于 2022-8-19 13:04
现在绝对没问题了,你运行一下试试,只能输入3个数字,旧版本的课件关于数组和字符串的那节课还没学过
...
没问题了
但是这一行代码多好
result = result * 10 + (ch - '0');