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 就復雜些了,它是用來進行“格式化輸出”的。解釋起來比較費筆墨,我貼個之前的回答: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。
- 2 回答
- 0 關注
- 3229 瀏覽
添加回答
舉報