第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么直接聲明的字符串和輸入的字符串不同(串插入問題)

為什么直接聲明的字符串和輸入的字符串不同(串插入問題)

C
FFIVE 2018-12-11 15:44:00
題目描述串插入 StrInsert(s,i,t)操作條件:串 s,t 存在,1≤i≤StrLength(s)+1。操作結(jié)果:將串 t 插入到串 s 的第 i 個字符位置上,s 的串值發(fā)生改變。題目來源及自己的思路來源:數(shù)據(jù)結(jié)構上機題目思路:直接利用指針對字符數(shù)組中的字符進行移動和賦值相關代碼void StrInsert(char * s, int i, const char * t){    if (i<1 || i>StrLength(s) + 1)     {        puts("函數(shù)StrInsert參數(shù)有問題!");        return;     }    char * p1;     p1 = s;    int j;     p1 = p1 + i - 1;    for (j = 0; j < StrLength(s) - i + 1; j++)         *(p1 + StrLength(s) + StrLength(t) - i - j) = *(p1 + StrLength(s) - i - j);//后面的元素的移動     s[StrLength(s) + StrLength(t)] = '\0';    for (j = 0; j < StrLength(t); j++)         *(p1 + j) = t[j];//對移動之后空出來的位置進行賦值}你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?在字符串t只有一個字符的時候,此處假設這個字符串為"d"當待插入的字符串s賦值以 char a[20] = "abc";的形式時,調(diào)用該函數(shù)StrInsert(a,2,"d")可以使得a = "adbc"當待插入的字符串s賦值以 char a[20]; scanf("%s",a);時,調(diào)用該函數(shù)直接導致內(nèi)存讀取錯誤,打印出來的字符串是類似于“燙燙燙......”希望能有大佬解答這個問題,非常感謝!??!
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

用調(diào)試觀察一下就知道問題在哪了

首先以char a[20] = "abc";的形式,在內(nèi)存里數(shù)據(jù)是這樣的:
0x60fefc: 61 62 63 00 00 00 00 00|00 00 00 00 00 00 00 00
0x60ff0c: 00 00 00 00 3d 00 00 00|00 80 3f 00 94 ff 60 00
"abc"后面跟了17個'0'

第二種方式char a[20]; scanf("%s",a);,在內(nèi)存里數(shù)據(jù)是這樣的:
0x60fefc: 61 62 63 00 b0 19 40 00|45 00 00 00 08 00 00 00
0x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00
"abc"后面只有1個'0',后面就不知道是什么亂七八糟的東西了

你程序里的StrLength()函數(shù)是自己實現(xiàn)的嗎?我姑且當成strlen,strlen是以'\0'為判斷字符結(jié)束,從而計算長度
而第二種方式執(zhí)行的時候,以下語句:

    for (j = 0; j < StrLength(s) - i + 1; j++)
        *(p1 + StrLength(s) + StrLength(t) - i - j) = *(p1 + StrLength(s) - i - j);

執(zhí)行第一次*(p1 + 2) = *(p1 + 1)后,內(nèi)存里的數(shù)據(jù)變成這樣:
0x60fefc: 61 62 63 63 b0 19 40 00|45 00 00 00 08 00 00 00
0x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00
看到了嗎,字符串結(jié)束的標志'\0'被覆蓋了,下次再執(zhí)行strlen時,字符串的長度就跟預期不一樣了


查看完整回答
反對 回復 2018-12-11
  • 1 回答
  • 0 關注
  • 620 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號