为了账号安全,请及时绑定邮箱和手机立即绑定

为什么给数组赋值赋不上去

为什么给数组赋值赋不上去

C
慕后端8527005 2018-05-09 17:06:41
#include<stdio.h>#include<string.h>main(){ int n,a[100],i=0,l; scanf("%d",&n); while(n) { a[i]=n%10; n=n/10; i++; } l=strlen(a); printf("%d",l);}
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

比如 我定义一个char 数组a, 有一个语句是a[i++]=n%2;n是我输入的一个数...

a[i++]=n%2;  你是想把 n%2 得到的“数字的字符”存入 a 中吗?  这是不行的!

a 是字符数组,那么 a[i++] 得到的是 char 类型。而 n%2 得到的是整形。 绝大多数情况下,表示一个“数字”的整形值字符型值并不相同。所以这样赋值后的字符表示的并不是那个数字。

你似乎混淆了字符型和数值类型



我用puts无法打出,printf却可以,,我一直不明白为什么

puts 的参数是字符串,它就是简单地打印出这个字符串。你代码中的 a 是 int 数组,不是字符数组,所以无法正确打印。

而 printf 就复杂些了,它是用来进行“格式化输出”的。解释起来比较费笔墨,我贴个之前的回答:https://www.imooc.com/wenda/detail/334835

你看,printf 可以格式化输出各种类型,你说“printf却可以”,我不知道你用的是何种方式:

如果你用 %s 来打印 a,就是和用 puts 一样,肯定无法打印。

如果你碰巧了能够兼容的格式化指示符,也许可以看到打印出来。 但是这不能叫“正确”,因为之前“向 char 数组中存入整形值”的做法完全不符合你的意图,从根本上就错了! 后面就算能打印也是“碰巧/貌似正确”而已。



关于你上面说的输入的n不是0,strlen会返回1是指他将我的组数看成一个字符串,后面自动添加‘\0’吧

不是这样的!

strlen 函数只是进行计数,根本不会改动字符串。 它的计数方式很简单:一个个地数字符数组中的字符,直到遇到 '\0' 字符为止。

之前说“只要输入的 n 不是 0,strlen 就会返回 1”不准确,应该是“只要 n 的个位数字不是 0,strlen 就会返回 1”。原因是:

前面的代码会正确地向 int 数组 a 中存入 n 的各个位上的数。那么 a[0] 就是 n 的个位上的数字(且不会是 0)

strlen 要求参数应是字符数组。虽然错误地向 strlen 中传入了 int 数组,但在运行时 strlen 会强行把 int 数组当作 char 数组来计算。注意:这只是强行解释内存而已。

在内存中,char 类型占用 1 字节,int 类型会占用更多的字节(一般是4)。在绝大多数小端机器上,int 的字节序是低地址位在前。a[0] 中是不超过 9 的非 0 int 值,也就是 a[0] 的这段内存中第一个字节中的值一定不是 0,第二个字节中的一定是 0。strlen 在解释这段内存时会把第一字节当作第一个字符,第二字节当作第二个字符...   '\0' 字符就是值为 0 的字节,这样 strlen 只数了一个字节就遇到了 '\0' 字符,所以只会返回 1。

以上就是解释。如果你看不太明白,就先别管它了。别让这些把你弄得更糊涂了,现在你只需要明白是你误用了 strlen 就好了。



我不太明白您将的不给a初始值会有隐患?这个隐患是指?

哦,没什么。因为我不知道你后面会如何操作 a,只是简单地提示下:a 中未被赋值的那些元素的值不一定是 0。

查看完整回答
反对 回复 2018-05-11
  • 2 回答
  • 0 关注
  • 3082 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信