亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么給數組賦值賦不上去

為什么給數組賦值賦不上去

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 就復雜些了,它是用來進行“格式化輸出”的。解釋起來比較費筆墨,我貼個之前的回答:http://www.xianlaiwan.cn/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 關注
  • 3229 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號