課程
/后端開發(fā)
/C
/C語言入門
為什么先拼接再拷貝不行呢。。。
2015-01-28
源自:C語言入門 6-8
正在回答
首先你得知道:
s1是一個長度為100的字符數(shù)組。
s2是一個長度為4的字符數(shù)組。這是因為雖然你在聲明時沒有指定數(shù)組的長度,但是你用一個長度為4的字符串初始化s2,所以編譯器自動將s2的長度確定為4。
s3是一個長度為4的字符數(shù)組。道理同上。
strcat(s2, s3) 這個函數(shù)是將s3中的內(nèi)容(包括s3結(jié)尾的'\0')復(fù)制到s2中最后一個字符的后面(覆蓋掉s2原來結(jié)尾的'\0'),這樣就能把兩個字符串中的字符連起來了,并且還是'\0'結(jié)尾。
注意:這就需要s2有足夠的長度來容納這么多的字符,長度至少為 strlen(s2) + strlen(s3) + 1,最后這個1就是結(jié)尾的'\0'。
但是你的s2長度只有4,所以寫越界了。而后面的字符有可能寫入到了后面,也有可能無法成功寫入而發(fā)生錯誤。
為什么說是有可能呢? 因為strcat這個函數(shù)就是從s2的最后寫入s3的內(nèi)容,它不管你這個字符串到底要寫多長,也不知道容納它的數(shù)組有多長,其實它都不知道你的字符串是不是在數(shù)組中,它只是單純地在內(nèi)存中往后寫。所以很可能寫出界,更糟的是可能會覆蓋掉后面的東西,引起各種各樣的錯誤,甚至是崩潰! ?所以在真實的開發(fā)中千萬要注意數(shù)組訪問越界的問題。
在本站中它判斷你寫了?strcat( s1 , s3 ) 才算寫對。因為s1足夠長。
天再高又怎樣 提問者
我懂了
謝謝啦
但是我那樣做就顯示不出來結(jié)果了,...
這個只是個練習(xí),可以按你說的,這里主要的目的是讓大家對該方法的使用有個認(rèn)知和練習(xí)
舉報
C語言入門視頻教程,帶你進(jìn)入編程世界的必修課-C語言
2 回答strcat與strcpy
3 回答關(guān)于strcat和strcpy
2 回答一會strcpy,一會strcat...
2 回答C語言中關(guān)于strcat和strcpy的使用問題
1 回答先strcat(s2,s3),然后strcpy(s1,s2)
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2015-01-28
首先你得知道:
s1是一個長度為100的字符數(shù)組。
s2是一個長度為4的字符數(shù)組。這是因為雖然你在聲明時沒有指定數(shù)組的長度,但是你用一個長度為4的字符串初始化s2,所以編譯器自動將s2的長度確定為4。
s3是一個長度為4的字符數(shù)組。道理同上。
strcat(s2, s3) 這個函數(shù)是將s3中的內(nèi)容(包括s3結(jié)尾的'\0')復(fù)制到s2中最后一個字符的后面(覆蓋掉s2原來結(jié)尾的'\0'),這樣就能把兩個字符串中的字符連起來了,并且還是'\0'結(jié)尾。
注意:這就需要s2有足夠的長度來容納這么多的字符,長度至少為 strlen(s2) + strlen(s3) + 1,最后這個1就是結(jié)尾的'\0'。
但是你的s2長度只有4,所以寫越界了。而后面的字符有可能寫入到了后面,也有可能無法成功寫入而發(fā)生錯誤。
為什么說是有可能呢? 因為strcat這個函數(shù)就是從s2的最后寫入s3的內(nèi)容,它不管你這個字符串到底要寫多長,也不知道容納它的數(shù)組有多長,其實它都不知道你的字符串是不是在數(shù)組中,它只是單純地在內(nèi)存中往后寫。所以很可能寫出界,更糟的是可能會覆蓋掉后面的東西,引起各種各樣的錯誤,甚至是崩潰! ?所以在真實的開發(fā)中千萬要注意數(shù)組訪問越界的問題。
在本站中它判斷你寫了?strcat( s1 , s3 ) 才算寫對。因為s1足夠長。
2015-03-03
我懂了
2015-01-28
謝謝啦
但是我那樣做就顯示不出來結(jié)果了,...
2015-01-28
這個只是個練習(xí),可以按你說的,這里主要的目的是讓大家對該方法的使用有個認(rèn)知和練習(xí)