2 回答
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。
- 2 回答
- 0 关注
- 3063 浏览
添加回答
举报