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

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

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

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

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

1 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

用調試觀察一下就知道問題在哪了

首先以char a[20] = "abc";的形式,在內存里數據是這樣的:
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);,在內存里數據是這樣的:
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()函數是自己實現的嗎?我姑且當成strlen,strlen是以'\0'為判斷字符結束,從而計算長度
而第二種方式執行的時候,以下語句:

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

執行第一次*(p1 + 2) = *(p1 + 1)后,內存里的數據變成這樣:
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
看到了嗎,字符串結束的標志'\0'被覆蓋了,下次再執行strlen時,字符串的長度就跟預期不一樣了


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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