鱼C论坛

 找回密码
 立即注册
查看: 601|回复: 6

[已解决]关于将字符输入到数组

[复制链接]
发表于 2020-7-16 12:25:39 | 显示全部楼层 |阅读模式

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

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

x
*myitoa函数中if (num < 0)
{
str[i++] = '-';
num = -num;
}

此刻i == 1 所以str[1]内存储的值应该是'-'但是在取值时我发现str[1] == 50 str[0] == 45 str[2] == 48
在我使用printf("%d\n", str[1]);时输出的是上面的数据 当我将%d改为%s时程序直接罢工了 这是什么原因?
  1. #include <stdio.h>

  2. char *myitoa(int num, char *str);

  3. char *myitoa(int num, char *str)
  4. {
  5.         int dec = 1;
  6.         int i = 0;
  7.         int temp;

  8.         if (num < 0)
  9.         {
  10.                 str[i++] = '-';
  11.                 num = -num;
  12.         }

  13.         temp = num;

  14.         while (temp > 9)
  15.         {
  16.                 dec *= 10;
  17.                 temp /= 10;
  18.         }

  19.         while (dec != 0)
  20.         {
  21.                 str[i++] = num / dec + '0';
  22.                 num = num % dec;
  23.                 dec /= 10;
  24.         }

  25.         str[i] = '\0';

  26.         return str;
  27. }

  28. int main(void)
  29. {
  30.         char str[10];

  31.         printf("%s\n", myitoa(520, str));
  32.         printf("%s\n", myitoa(-1234, str));

  33.         return 0;
  34. }
复制代码

最佳答案
2020-7-16 14:21:18
你的程序执行完41行之后,str中存放的是:'5'、'2'、'0'、'\0'
接下来执行第42行,进入myitoa函数后,执行if语句,然后str[0]被修改为 '-',而此时后面的单元还没有改变,依然是 '2'、'0'、'\0' 。这是你查看这几个单元的值时,看到的ASCII码分别是str[0]=45, str[1]=50, str[2]=48 str[3]=0
当你执行完下面的第二个while循环后,str的各个单元才被改为"-1234\0"
  1. str[i++] = num / dec + '0'
复制代码

这是把数字转为对应的ASCII码值,将每个数字加上0的ASCII值就变成了对应的ASCII码值了,例如:1+'0'就是1+48=49,即'1'的ASCII值
函数声明中,char *myitoa(int num, char *str) 前面的char*是说函数的返回值是char类型的指针,即函数最后的return内容为char类型的指针;括号内的是函数的两个参数,一个是int类型的变量,一个是char类型的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-16 13:13:52 | 显示全部楼层
用你的代码可以正常输出520和-1234
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 13:31:38 | 显示全部楼层
chxchxkkk 发表于 2020-7-16 13:13
用你的代码可以正常输出520和-1234

我刚开始的时候不理解str[i++] == '-'那一句
因为我之后用了一个printf用来查看str的值
但是最后的结果都是数字
刚刚问过 str[i++]中的i在下一句执行i++ 此刻i为0 所以'-'存入了str[0]中
但是我获取的是str[1]才会有错误
已经解决了 谢谢兄弟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 13:54:44 | 显示全部楼层
对了 这里还有一点不理解的 为什么str[i++] 里面的数要加'0'
  1. while (dec != 0)
  2.         {
  3.                 str[i++] = num / dec + '0';
  4.                 num = num % dec;
  5.                 dec /= 10;
  6.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 13:57:57 | 显示全部楼层
为什么这个函数在声明时用了'*'在这里有什么特殊的含义么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-16 14:21:18 | 显示全部楼层    本楼为最佳答案   
你的程序执行完41行之后,str中存放的是:'5'、'2'、'0'、'\0'
接下来执行第42行,进入myitoa函数后,执行if语句,然后str[0]被修改为 '-',而此时后面的单元还没有改变,依然是 '2'、'0'、'\0' 。这是你查看这几个单元的值时,看到的ASCII码分别是str[0]=45, str[1]=50, str[2]=48 str[3]=0
当你执行完下面的第二个while循环后,str的各个单元才被改为"-1234\0"
  1. str[i++] = num / dec + '0'
复制代码

这是把数字转为对应的ASCII码值,将每个数字加上0的ASCII值就变成了对应的ASCII码值了,例如:1+'0'就是1+48=49,即'1'的ASCII值
函数声明中,char *myitoa(int num, char *str) 前面的char*是说函数的返回值是char类型的指针,即函数最后的return内容为char类型的指针;括号内的是函数的两个参数,一个是int类型的变量,一个是char类型的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-17 17:51:56 | 显示全部楼层
sunrise085 发表于 2020-7-16 14:21
你的程序执行完41行之后,str中存放的是:'5'、'2'、'0'、'\0'
接下来执行第42行,进入myitoa函数后,执行 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 12:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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