看板 C_and_CPP 關於我們 聯絡資訊
想請問版上的強者們,一題筆試遇到的問題 問題如下: ---------------------------------- 請問以下的code有甚麼問題? #include<stdio.h> #include<string.h> #include<stdlib.h> void reverse(char *p) { int i,j;char c; for(i=0,j=strlen(p)-1;i<j;i++,j--) { c=p[i]; p[i]=p[j]; p[j]=c; } } int main() { char s[]="ABCDEFG"; reverse(s); printf("s=%s\n",s); system("pause"); return 0; } ---------------------------------- (ps.我用dev c++跑卻有跑出正確的結果,感覺上好像沒有問題啊) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.49.68 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1469462029.A.C1B.html
ychch: 宣告的字串常數所在的記憶體位址是不能被修改的~ 07/26 00:02
Richun: reverse的函式宣告有問題,不能用char*,會出事。 07/26 00:08
Richun: 這個程式反轉了一個"陣列",但是直接reverse("ABCDEFG"); 07/26 00:09
Richun: 你測試完就知道會發生什麼事 07/26 00:09
Schottky: strlen() 每呼叫一次就會計算一次陣列長度 07/26 00:17
Schottky: 好好一個O(N)可以解決的問題被他寫成O(N^2),效能悲劇 07/26 00:17
wtchen: char s[] 不算字串常數吧? 07/26 00:38
Caesar08: 他指的是,如果用reverse("ABCDEFG")的話 07/26 01:00
Caesar08: 如果用char s[]就沒事 07/26 01:00
shec1213: strlen()只有被call一次阿... 07/26 01:17
Schottky: 喔喔,strlen() 是我看錯了 XD 07/26 01:34
ilms49898723: 考這麼不直覺歐? 我認為是對的說 07/26 07:29
ilms49898723: 在code中也沒用到字串常數我們還要腦補他會用字串 07/26 07:30
ilms49898723: 常數去想歐? 07/26 07:31
Frozenmouse: 應該不會是要考 int v.s size_t 吧( ゚д゚) 07/26 07:39
uranusjr: 但他給的 input 也不可能會爆, 要說錯也很牽強 07/26 10:07
uranusjr: 如果只給 reverse 那倒是可以說出一些問題 07/26 10:07
uranusjr: 不然真要說的話 system("pause") 也算是錯的 07/26 10:08
uranusjr: 喔還有在某些標準下 int main() 也不對 07/26 10:11
Caesar08: 有解答嗎? 07/26 13:24
steve1012: 覺得有問題都能寫吧 不一定有標準答案 07/27 05:44
steve1012: 為啥一題只能有一種答案 07/27 05:45
steve1012: 寫Ali 要考量一下edge cases 算蠻正常的吧 07/27 05:45
EdisonX: 亂入一下,原本函式裡面用 size_t 反而問題比較大 07/28 18:21
EdisonX: 考慮到空字串的話就 gg 了 07/28 18:21
PkmX: reverse("ABCDEFG"); 是 caller 自己寫爛啊 把const拿掉了 07/29 11:28
PkmX: 可以改用ssize_t或ptrdiff_t 不過前者只有在posix裡面 07/29 11:31
PkmX: 還是改用for (char* i=p, j=p+strlen(p)-1; 這樣比較安全XD 07/29 11:32
remmurds: 不要再用 dev c++ 了...拜託 07/30 09:20