[問題] 一題面試遇到的問題

看板C_and_CPP作者 (佛羅倫斯)時間7年前 (2016/07/25 23:53), 編輯推噓7(7022)
留言29則, 13人參與, 最新討論串1/1
想請問版上的強者們,一題筆試遇到的問題 問題如下: ---------------------------------- 請問以下的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

07/26 00:02, , 1F
宣告的字串常數所在的記憶體位址是不能被修改的~
07/26 00:02, 1F

07/26 00:08, , 2F
reverse的函式宣告有問題,不能用char*,會出事。
07/26 00:08, 2F

07/26 00:09, , 3F
這個程式反轉了一個"陣列",但是直接reverse("ABCDEFG");
07/26 00:09, 3F

07/26 00:09, , 4F
你測試完就知道會發生什麼事
07/26 00:09, 4F

07/26 00:17, , 5F
strlen() 每呼叫一次就會計算一次陣列長度
07/26 00:17, 5F

07/26 00:17, , 6F
好好一個O(N)可以解決的問題被他寫成O(N^2),效能悲劇
07/26 00:17, 6F

07/26 00:38, , 7F
char s[] 不算字串常數吧?
07/26 00:38, 7F

07/26 01:00, , 8F
他指的是,如果用reverse("ABCDEFG")的話
07/26 01:00, 8F

07/26 01:00, , 9F
如果用char s[]就沒事
07/26 01:00, 9F

07/26 01:17, , 10F
strlen()只有被call一次阿...
07/26 01:17, 10F

07/26 01:34, , 11F
喔喔,strlen() 是我看錯了 XD
07/26 01:34, 11F

07/26 07:29, , 12F
考這麼不直覺歐? 我認為是對的說
07/26 07:29, 12F

07/26 07:30, , 13F
在code中也沒用到字串常數我們還要腦補他會用字串
07/26 07:30, 13F

07/26 07:31, , 14F
常數去想歐?
07/26 07:31, 14F

07/26 07:39, , 15F
應該不會是要考 int v.s size_t 吧( ゚д゚)
07/26 07:39, 15F

07/26 10:07, , 16F
但他給的 input 也不可能會爆, 要說錯也很牽強
07/26 10:07, 16F

07/26 10:07, , 17F
如果只給 reverse 那倒是可以說出一些問題
07/26 10:07, 17F

07/26 10:08, , 18F
不然真要說的話 system("pause") 也算是錯的
07/26 10:08, 18F

07/26 10:11, , 19F
喔還有在某些標準下 int main() 也不對
07/26 10:11, 19F

07/26 13:24, , 20F
有解答嗎?
07/26 13:24, 20F

07/27 05:44, , 21F
覺得有問題都能寫吧 不一定有標準答案
07/27 05:44, 21F

07/27 05:45, , 22F
為啥一題只能有一種答案
07/27 05:45, 22F

07/27 05:45, , 23F
寫Ali 要考量一下edge cases 算蠻正常的吧
07/27 05:45, 23F

07/28 18:21, , 24F
亂入一下,原本函式裡面用 size_t 反而問題比較大
07/28 18:21, 24F

07/28 18:21, , 25F
考慮到空字串的話就 gg 了
07/28 18:21, 25F

07/29 11:28, , 26F
reverse("ABCDEFG"); 是 caller 自己寫爛啊 把const拿掉了
07/29 11:28, 26F

07/29 11:31, , 27F
可以改用ssize_t或ptrdiff_t 不過前者只有在posix裡面
07/29 11:31, 27F

07/29 11:32, , 28F
還是改用for (char* i=p, j=p+strlen(p)-1; 這樣比較安全XD
07/29 11:32, 28F

07/30 09:20, , 29F
不要再用 dev c++ 了...拜託
07/30 09:20, 29F
文章代碼(AID): #1NbZODmR (C_and_CPP)