鱼C论坛

 找回密码
 立即注册
查看: 2054|回复: 11

[已解决]C语言while语句和do...while语句02

[复制链接]
发表于 2023-12-27 19:13:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 liyifeng295641 于 2024-1-3 15:54 编辑

下面是小甲鱼课后的练习题,就第16行有点不理解,@FishC
题目:
2. C 语言中有个 atoi 函数(定义于 <stdlib.h> 头文件中),用于将字符串中的值解析为对应的整型数字。现在要求我们自己写一个程序,实现类似的功能。
基本要求:

A. 将用户输入的字符串中代表数字的字符转换为整型数值

B. 打印转换结果

C. 只打印第一组数字

提示:你可以使用 break 语句在适当的时候跳出循环。

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int ch;
  5.         int num = 0;

  6.         printf("请输入待转换的字符串:");

  7.         do
  8.         {
  9.                 ch = getchar();

  10.                 if (ch >= '0' && ch <= '9')
  11.                 {
  12.                         num = 10 * num + (ch - '0');
  13.                 }
  14.                 else
  15.                 {
  16.                         if (num)
  17.                         {
  18.                                 break; // 如果已有数字,则退出循环
  19.                         }
  20.                 }

  21.         }
  22.         while (ch != '\n');

  23.         printf("结果是:%d\n", num);

  24.         return 0;
  25. }
复制代码
最佳答案
2023-12-27 19:38:23
liyifeng295641 发表于 2023-12-27 19:38
为什么sum要乘10再加上数字呢?

很好的问题!乘以10再加上数字的操作是为了实现将每个数字字符依次拼接成整数的效果。

让我们来看一个例子,假设输入的字符串是"123"。开始时,`num`的初始值为0。

1. 第一次循环,读取到字符'1',`(ch - '0')`的结果是1,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 0 * 10 + 1`,此时`num`的值变为1。
2. 第二次循环,读取到字符'2',`(ch - '0')`的结果是2,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 1 * 10 + 2`,此时`num`的值变为12。
3. 第三次循环,读取到字符'3',`(ch - '0')`的结果是3,然后执行 `num = num * 10 + (ch - '0')`,即 `num = 12 * 10 + 3`,此时`num`的值变为123。

通过这样的操作,我们将字符串中的每个数字字符拼接成了整数。如果不乘以10,每次累加的数字只会是当前字符的值,无法实现拼接的效果。所以需要先乘以10,使得在每次累加前,将已经处理的数字字符向左位移一位。这样就能够正确地将每个数字字符拼接成整数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-27 19:17:42 | 显示全部楼层
FishC 发表于 2023-12-27 19:13
这段代码的作用是统计输入字符串中包含的数字个数。在第16行,是对输入字符进行判断,判断其是否为数字字符 ...

小甲鱼说这段代码是实现atoi 函数的作用,不是找字符串中包含的数字个数的。这个笨蛋
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 19:28:46 | 显示全部楼层
FishC 发表于 2023-12-27 19:17
非常抱歉,我理解错了你的问题。你是问关于实现 `atoi` 函数的问题。

事实上,`atoi` 函数是将字符串转 ...

这段代码用于将字符串中的值解析为对应的整型数字
比如说:输入:123fishc 输出:123
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int ch;
  5.         int num = 0;

  6.         printf("请输入待转换的字符串:");

  7.         do
  8.         {
  9.                 ch = getchar();

  10.                 if (ch >= '0' && ch <= '9')
  11.                 {
  12.                         num = 10 * num + (ch - '0');
  13.                 }
  14.                 else
  15.                 {
  16.                         if (num)
  17.                         {
  18.                                 break; // 如果已有数字,则退出循环
  19.                         }
  20.                 }

  21.         }
  22.         while (ch != '\n');

  23.         printf("结果是:%d\n", num);

  24.         return 0;
  25. }
复制代码

我不理解的是16行代码,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 19:34:52 | 显示全部楼层
FishC 发表于 2023-12-27 19:28
这段代码就是用来实现将输入的字符串转换为对应的整数数字。它通过逐个读取字符,判断是否为数字字符,然 ...

逐步解析一下num = num * 10 + (ch - '0'); // 将字符转换为数字并累加到num中
num的初始值为0,当判断为数字字符后,为什么这样做,
(ch - '0')这段代码是先将 ch转为Ascll字符在减去'0'的Ascll字符的48吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 19:38:12 | 显示全部楼层
FishC 发表于 2023-12-27 19:35
是的,你理解得非常正确!在`num = num * 10 + (ch - '0')`这行代码中,`(ch - '0')`的作用就是将字符`ch ...

为什么sum要乘10再加上数字呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 19:39:14 | 显示全部楼层
FishC 发表于 2023-12-27 19:38
很好的问题!乘以10再加上数字的操作是为了实现将每个数字字符依次拼接成整数的效果。

让我们来看一个例 ...

噢噢噢噢,这段代码好巧妙啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-26 04:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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