[問題] 簡單的小程式

看板C_and_CPP (C/C++)作者 (0980092554)時間16年前 (2010/01/29 00:18), 編輯推噓4(4023)
留言27則, 3人參與, 最新討論串1/1
小弟寒假自修c語言,寫一個字串反轉的程式後, 發現執行後會有問題(dev-cpp) 幾經測試之後,發現字串長度<=4時,輸出正常。 一旦字串長度為5,竟然變成迴圈回到輸入字串的地方。 字串再更長執行起來就當掉了,想問板上的前輩們… 為什麼會造成這樣的結果呀? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char str[]=""; printf("enter a string:"); scanf("%s",&str); char* reverse_str(char *str) { int i,j; char c; for(i=0,j=strlen(str)-1;i<j;i++,j--){ c=str[i]; str[i]=str[j]; str[j]=c; } return str; } printf("%s",reverse_str(str)); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.203.181

01/29 00:24, , 1F
char str[]="" 改成 char str[100];
01/29 00:24, 1F

01/29 00:24, , 2F
因為你完全沒有 allocate 空間給要輸入的字串
01/29 00:24, 2F

01/29 00:25, , 3F
之前可以執行完全只是蓋到其它的 memory 了
01/29 00:25, 3F

01/29 00:25, , 4F
這也是為什麼長度長一點的話就會當掉的原因
01/29 00:25, 4F

01/29 00:29, , 5F
我原本想說,用多少就給多少所以沒有給長度…
01/29 00:29, 5F

01/29 00:31, , 6F
那像是char str[]="xxx"; 的話就是等同有allocate了?
01/29 00:31, 6F

01/29 00:31, , 7F
不行,你一定要預留空間給他。不然可以改用 C++ String
01/29 00:31, 7F

01/29 00:32, , 8F
應該不對,你這樣寫那個 "xxx" 是常數字串
01/29 00:32, 8F

01/29 00:32, , 9F
str[] 變成是指向這個常數字串的指標,但是你不能更改字串
01/29 00:32, 9F

01/29 00:34, , 10F
char *str="..."; 這樣才是str指到常數字串的意思;
01/29 00:34, 10F

01/29 00:34, , 11F
在scanf接收使用者字串時,存入&str不就代表---
01/29 00:34, 11F

01/29 00:35, , 12F
char str[]="..."; 是compiler自己算出"..."大小開給str
01/29 00:35, 12F

01/29 00:35, , 13F
啊,對不起,剛才講太快,腦殘錯了orz
01/29 00:35, 13F

01/29 00:35, , 14F
並init成"...", 所以str[]="..." 的case是可以寫的:)
01/29 00:35, 14F

01/29 00:35, , 15F
是 Victor 兄講的那樣沒有錯,不好意思orz
01/29 00:35, 15F

01/29 00:38, , 16F
偶爾難免閃神講錯的時候啦XD 小弟搞笑的次數可多了Orz
01/29 00:38, 16F

01/29 00:40, , 17F
接著回原po的推: 所以空間不夠你讓使用者寫超過的話, 就
01/29 00:40, 17F

01/29 00:40, , 18F
等著出包啦XD 以前這種利用Input buffer overflow的漏洞
01/29 00:40, 18F

01/29 00:40, , 19F
好像還滿常見的呢:)
01/29 00:40, 19F

01/29 00:41, , 20F
剛才試了"" 和 ".."和"..."的分別,後兩種可以用耶
01/29 00:41, 20F

01/29 00:42, , 21F
所以意義上 ""是空字串,"..."是動態預留空間嗎
01/29 00:42, 21F

01/29 00:44, , 22F
"..." 就是留 4 個字元的空間 (包含 '\0' )
01/29 00:44, 22F

01/29 00:44, , 23F
空字串有'\0'在吧?? sizeof(str)看一下應該是1 byte吧??
01/29 00:44, 23F

01/29 00:44, , 24F
另外它稱不上動態預留, 因為這是compile time決定的, 不
01/29 00:44, 24F

01/29 00:45, , 25F
是run time決定的; 所以使用者輸入超過4個字元一樣會包!
01/29 00:45, 25F

01/29 00:47, , 26F
我懂了,謝謝樓上的前輩們 是compiler幫我init
01/29 00:47, 26F

01/29 00:48, , 27F
使用者所輸入的字串
01/29 00:48, 27F
文章代碼(AID): #1BORZ369 (C_and_CPP)
文章代碼(AID): #1BORZ369 (C_and_CPP)