看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hardware (哈味)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Linux GCC : 問題(Question): : #include <unistd.h> : #include <stdio.h> : #include <stdlib.h> : #include <time.h> : int main(int argc, char **argv) : { : char *line = "abc dddd efg hhhhhhhhhh"; : /* 從第五個位元開始抓6個位元 : 也就是抓出來的結果想要是 : "dddd e" : 目前找C的字串處理函式找不太到 : 不知道怎麼抓出來 感謝大大的指導 : */ : return 0; : } 如果沒有處理函式,那就自己寫 我學長說,不能奢望每次都有標準函式庫或是別人寫好的可以用 char self_str[7]; int i; for(i=0;i<6;i++) self_str[i]=*(line+4+i); self_str[i]='\0'; //這行一定要記得加,很多人會忘記 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.187.173 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1473691382.A.706.html
Caesar08: 原文的回文就有解答了09/12 22:59
我知道,但是那個回應是對於直接印出的解法 如果後續還要做字串處理,那就要先把字串存起來 ※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:03:56
Caesar08: ... 你真的有看原文的回文嗎?09/12 23:04
不知道你說的是? ※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:05:15
Caesar08: strncpy...09/12 23:06
那我想你根本沒有看清楚我的回答 我是說, 如果沒有處理函式 strncpy是在string.h裡面的處理函式沒錯吧?! ※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:09:35
Caesar08: 就include就好了,strncpy也是standard c function09/12 23:12
include就好?我不認為這是一個好現象,了解字串處理運作方式 比直接使用重要多了,不要覺得說這是一個很簡單的函式,每個人一定會 就是有人不會,不然怎麼會有人問問題呢?而且你知道每次include一個header file 會多多少資源進來嗎??如果只需要某樣字串處理功能,那何不自己寫就好了? 我不敢說我自己懂很多,但是我自己從編譯器(turbo C)裡面看過 當我include不同header file時,所編譯的檔案數是多很多的 case 1: #include<stdlib.h> #include<stdio.h> case 2: #include<stdlib.h> #include<stdio.h> #include<math.h> 而且我們公司在GCC時,呼叫math.h時,根本沒有pow(double *,double *)這個函數 所以不是include標準函式庫就一定保證標準函式什麼都會有 以上有錯誤歡迎高手指教,感謝 ※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:24:18
EdisonX: 1. 情非得已情況下永遠不要自己造輪子。 2. 自己寫的比較09/12 23:31
EdisonX: 慢,沒經過驗證。 3. pow (double * , double *) 是 ???09/12 23:31
EdisonX: math.h 的確沒有 pow(double * , double *) 啊 @@09/12 23:33
阿pow的參數型態不是double是什麼??只是裡面是區域變數罷了 double __cdecl pow(_In_ double _X, _In_ double _Y); 完整標準函式定義貼上來這樣可以嗎??? 我改正=> double pow(double,double);
EdisonX: 話說回來,如果今天工作看到有人自己寫 strcpy,我想有厭惡09/12 23:34
Caesar08: 是阿 不是好現象,那你就都全部自己刻吧09/12 23:34
EdisonX: 感的應該不只有我一人 @@ 原因就如上所述。09/12 23:34
工作歸工作,選擇性會不同,原PO沒說工作或是作業或是自己好玩 我只是提供一個萬用解法,自己造輪是一種學習,知道怎麼用,跟要自己造輪是不一樣的 不了解運作方式,只知道怎麼用,我看過我學弟的例子 問他strncpy運作原理,概念就好,不用全對 只知道這是可以複製A字串的n個字元到B字串,為什麼可以做,不知道,我當場傻眼
Caesar08: 你只需要一個strncpy,就只好自己寫一個strncpy09/12 23:37
Caesar08: 下次你只需要一個qsort,就只好自己做quick sort09/12 23:37
我都是自己玩自己造沒錯 ※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:49:02
EdisonX: @Caesar08,下次需要 cv::imread / cv::imwrite的時候..@@09/12 23:39
Caesar08: 另外,standard library可以預先編譯好,其實沒有編譯的09/12 23:41
Caesar08: 檔案數是多很多的 這種問題,如果是C++你才有可能要擔心09/12 23:42
※ 編輯: jacky1989 (111.250.187.173), 09/12/2016 23:54:42
Sirctal: 學長上過班沒?? 如果當自己練習當然是很好 但是出去後09/13 00:00
Sirctal: 你如果自己硬幹 你可能會被人家婊死09/13 00:01
Sirctal: 抱歉沒看好QQ09/13 00:01
我的工作不需要用到C,但是我有說過,當你要什麼沒什麼時 就只能自己造輪了,就如同我在公司想要呼叫pow函數,GCC就是跟我說,沒有這個函數 ※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 00:02:49
askacis: 自己刻func的例子通常是寫MCU或是bootcode09/13 00:07
Caesar08: 要不就是你GCC太舊,不然就是你不會用pow09/13 00:07
那我想是版本太舊了,因為我在Visual Studio還有Turbo C用法都一樣 double result; result = pow(5.0,6.0); ※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 00:10:24
EdisonX: 未看先猜 : gcc -o math math.c -lm 恭喜你白刻了。 XD09/13 00:10
askacis: 就連uclibc都有pow()了,你公司gcc是甚麼版本? 自己編的? 09/13 00:13
我會去確認看看,再跟各位回報 ※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 00:14:02
EdisonX: 疑!你的工作用不到C,那怎還會有這問題呢??09/13 00:14
因為我用C來做數據整理
askacis: 另外錯誤訊息貼上來,才知道是compile time還是linking09/13 00:15
※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 00:16:17
askacis: time報錯,linking time 的話加個-lm 說不定就搞定了wwww09/13 00:16
Bencrie: 天啊 ... 拿 Turbo C 來比。09/13 00:36
Bencrie: 大大你 printf 都從 int 21h 開始寫嗎09/13 00:42
這倒沒有,但是我知道int 21h
chuegou: 我也是自己刻那一派09/13 00:45
是吧是吧~~ ※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 00:47:23
CoNsTaR: 朝聖…09/13 03:50
noodleT: 除非是要自己做演算法練習,不然直接套用現成的是會比較09/13 06:53
noodleT: 好09/13 06:53
fatrabitree: 自己寫的通常沒有函式庫快09/13 08:56
descent: 我覺得你的想法很好, 不過紅黑樹也自己寫嗎?09/13 09:43
descent: 完成一個程式並不一定都要從輪子打造。09/13 09:44
descent: 學習的話, 從輪子打造是很棒的學習方式, 縱使打造的是09/13 09:45
descent: 破輪子09/13 09:45
descent: math.h N1750 在 7.12.7.4 有描述 pow(), gcc 沒支援 09/13 09:49
descent: 真的是很奇怪, 你的平台很特殊嗎?09/13 09:49
我今天確定了 打pow會出現undefined reference to 'pow' 不過僅限在分數次方時 pow(5.0,1/6.0)這樣就會出問題 gcc是4.1.2版 ※ 編輯: jacky1989 (180.204.17.99), 09/13/2016 11:24:53
CoNsTaR: undefined reference... 你編譯有加 -lm 嗎 09/13 11:25
Caesar08: 怪了,1/6.0的結果也是double才對09/13 11:57
descent: 可以 附上你的測試程式和編譯指令嗎? 09/13 12:42
shadow0326: 手邊沒有gcc4.1.2,不過有3.4.6,編起來十分正常09/13 12:45
PkmX: gcc 4.1.2 都快要一個世紀以前了...09/13 13:00
askacis: undefined reference to 是linking time的問題 09/13 14:13
askacis: 代表你連compile time跟linking time都不甚清楚 09/13 14:14
askacis: 加個-lm 試試看,還有問題再上來說沒有support 09/13 14:14
askacis: 除非是自己編的gcc,不然pow()在gcc都會有才對 09/13 14:17
steve1012: 自己造輪子是十分危險的 尤其在production code 09/13 15:14
steve1012: 他這個例子不是太難的函數 複雜點的會有很多edge cases 09/13 15:15
steve1012: 用library 的原因是因為它們已經被大量測試過 bug幾乎 09/13 15:16
steve1012: 沒有 09/13 15:16
steve1012: 自己刻學當然很好 但是不是自己用的就科科 有std map 09/13 15:17
steve1012: 你偏要自己刻一個RB tree嗎 不論速度 安全性 維護上 09/13 15:17
steve1012: 都是問題09/13 15:17
Caesar08: 速度通常會比較慢,因為compiler通常都有一些"特別"的09/13 15:19
Caesar08: function可以呼叫09/13 15:19
CoNsTaR: 每個人自己刻的版本行為都一點點不一樣 你的 strncpy 包09/13 15:42
CoNsTaR: 含 '\0' 我的不包含 以後看到 strncpy 我都不知道到底是09/13 15:43
CoNsTaR: 哪一種 連一個簡單的 strncpy 都可以有一堆問題 更複雜09/13 15:43
CoNsTaR: 的你要怎麼辦09/13 15:43
oscar60111: 怎麼這篇有種看到某king的感覺... 09/13 16:24
EdisonX: 推樓上,曾接過wchar和char互換的,個人刻的就好幾個,09/13 16:26
EdisonX: 還有四捨五入的也二,三個,這個到時肯定查死。 09/13 16:26
Bencrie: 某 king 是說隔壁棚的吉祥物嗎 XDD09/13 17:15
CoNsTaR: 其實我在想 會不會是編譯器支援過度了 直接把 pow 值算出09/13 20:48
CoNsTaR: 來所以不會有 undefined reference 09/13 20:48
CoNsTaR: 但是如果遇到分數編譯器就不會先算 就真的呼叫了 pow 然 09/13 20:48
CoNsTaR: 後又沒有加 -lm 於是爆炸 09/13 20:48
yvb: gcc3.4 起支援 built-in pow() 運算, 但僅限整數的整數次方, 09/13 21:59
yvb: 及實數的正整數次方; 到 gcc4.3 支援更完整的內建常數 pow(). 09/13 22:01
yvb: 上述的內建 pow() 都必須是常數參數, compile time 時就算好. 09/13 22:06
CoNsTaR: 推樓上博學多聞 XDD 09/13 22:28
yvb: 不, 是 google 博學多聞, 最適合用來問冷知識了 XD 09/13 22:39
好的各位 我已經證實了,是沒加 -lm的問題,加了以後就能正常運算了 這一篇有解釋,有興趣的人可以參考看看 #1DlIJu3B ※ 編輯: jacky1989 (111.250.187.173), 09/13/2016 23:17:12
CoNsTaR: 其實推文就有大大說明了…09/13 23:22
descent: man pow 就有說要 -lm09/13 23:34
firejox: 說不定人家沒有man阿XD09/13 23:57
我想,討論誰說過的意義不大,重點應該是為什麼要這樣做 之前學英文時,碰到一個文法問題,問老師,老師只講了一句,It's rule. 那還是沒有解釋到阿......我還是得死背這個規則 但是後來又碰到一個老師,我問他,normal跟typical的差別,老師說 我們要形容A,會說A是一般人,而不會說A是一個正常人吧??(秒懂 所以,我還是堅持,寫程式以前,要先自己造過輪子,至於工作上要怎麼用 那就是自己去取捨,拚速度,std. library是一個好選擇,除非你的可以比函式庫快 拚自己的方便性,那就是自己的輪子最好用,不過後續幾乎都是自己要maintain就是了 或是有辦法很順利的傳下去 ※ 編輯: jacky1989 (111.250.187.173), 09/14/2016 00:27:14
askacis: 長篇大論之前還是把基本中的基本學好吧 09/14 00:54
我常常提出一個問題,什麼叫基本?什麼又叫學好?
CoNsTaR: 誰說過的意義是不大 但是原Po連推文都不看問題就大了 09/14 01:07
CoNsTaR: 你要造輪子自己在旁邊學習玩沙的時候隨便你慢慢造 09/14 01:09
firejox: 你不會為了開車而去組一台車子吧... 09/14 01:09
CoNsTaR: 但是回文說 include standard library 不是好現象是怎樣09/14 01:11
CoNsTaR: ?09/14 01:11
那我不知道你有沒有試著去了解原PO的真正問題在哪裡呢? 一個連最基本字串處理函式都不了解,那一定是對整個概念不夠熟 如果直接就教他,include標準函式庫,無非是給他魚吃而不是教他釣魚 而我想表達的只是,永遠不要過於依賴標準函式庫,就這樣 以前我在帶學弟也是這樣教,不討論我的教法是不是正確的 至少我看到學弟的FB上寫的是,助教教的比老師還要好,都聽得懂 ※ 編輯: jacky1989 (111.250.187.173), 09/14/2016 01:23:21
CoNsTaR: 你的學長這麼厲害 叫他多教教學弟啊 怎麼會讓學弟來 ptt09/14 01:13
CoNsTaR: 問蠢問題09/14 01:13
CoNsTaR: 人家給的建議一副愛理不理 不知道這串是在客氣什麼09/14 01:14
我不懂你說這句的意思,人家的建議我有聽,不然我今天去公司測 -lm 測假的??
CoNsTaR: 這麼厲害你的 gcc 怎麼會 undefined reference? 09/14 01:15
CoNsTaR: 回個文也要優越感這麼重 你要優越感是沒問題 先把基礎打 09/14 01:17
我也不知道你認為哪一段優越感重?我第一次寫程式光printf都搞好幾個小時了,怎樣都 不? 所以我知道只知道使用標準函式庫而不知道概念的痛苦,所以我堅持教人就應該從造輪開 始
CoNsTaR: 好再說可以? 09/14 01:17
CoNsTaR: 之前還看你Po文說教學長“雙重指標”???學長學會了嗎09/14 01:18
CoNsTaR: ? 09/14 01:18
不好意思,學長學會了,而且在上市上櫃公司上班 我想,各有各的立場與堅持,不想跟你筆戰,以下就不要在回覆了,如果純交流那絕對歡 迎 感謝你的指教 PS,我到工作才碰過GCC,以前都是Windows系統,所以不懂 -lm 的問題 ※ 編輯: jacky1989 (111.250.187.173), 09/14/2016 01:34:08
CoNsTaR: 原來還是助教 抱歉我個人對C語言助教有非常大的偏見09/14 01:40
CoNsTaR: 我大一的C語言段考被看不懂我答案的助教打41分09/14 01:40
CoNsTaR: 看不懂就劃掉我怨念很深 助教還是重修100遍再來改考卷吧09/14 01:40
那我想是你助教害了你,第一堂課我都跟學弟說,我不管你怎麼寫 我也不管你用什麼方法,除非我有指定,不然只要會動就好,程式,沒有標準答案 我也期盼能從學弟的程式碼裡面看到我從來沒學過的東西
CoNsTaR: 還有我不反對學習的時候造輪子 但是你說include standard09/14 01:40
CoNsTaR: library是不好的現象是想怎樣?09/14 01:40
你要我說幾次? 原PO根本不知道有這樣東西 我是不知道我為什麼會說到讓你有如此深的誤會(也許我該重修國文?? 我意思是說,在完全不懂怎麼硬兜可以出來的狀況下,只教使用標準函式庫是不好的
CoNsTaR: 整篇就只會拿一些皮毛的東西來說嘴 發現自己的錯誤就巧 09/14 01:40
CoNsTaR: 妙迴避 你該不會覺得我說巧妙是在稱讚你吧 09/14 01:40
那你怎麼知道我沒有把這些錯誤記在自己的筆記裡?對於錯誤,就不用講太多 代表我就是不懂,有錯,那還要講什麼???
CoNsTaR: 然後順便幫樓上回答一下 你連基本是什麼都還要問那你還是09/14 01:40
CoNsTaR: 不要來討論好了 另外學好就是你一直以為你自己已經做到 09/14 01:40
CoNsTaR: 的事 謝謝09/14 01:40
而且我可是從來都沒有說我學好,我想我一直強調的都是我的過往經驗 版上比我強的高手有太多太多了,那我提出一種解法無非也是想要經由回答問題 來交流討論,來了解自己的作法到底對不對,如果不對,那我絕對請版主刪文 而且我也承認很多網友說的,在工作或是專案合作上應該使用標準函式庫,而不是自己造 輪 我也說,造輪就自己在學習時應該要做的事情,是聲波傳到你那邊慢了嗎?? ※ 編輯: jacky1989 (111.250.187.173), 09/14/2016 01:55:35
firejox: Std lib 不好的地方 應該是如果程式有漏洞 很好開shell09/14 01:55
firejox: Std lib 不好的地方 應該是如果程式有漏洞 很好開shell09/14 01:55
firejox: 吧XD 09/14 01:55
CoNsTaR: 看你態度不錯補推 不過不是很贊同你講的很多部分09/14 02:06
CoNsTaR: 看來或許你真的不是一個這樣的人 如果是我誤會你 你有你09/14 02:06
CoNsTaR: 該有的道歉09/14 02:06
感謝你的指教,但是我真的還是要再說一次,你大一的助教態度真的不是對的 也許他只是被教授指派,隨便帶一帶 希望往後你不要被這段不好的經驗影響寫程式的愉悅心情 以後還是歡迎對於我不對的地方提出指導,這樣我才會更進步 我也會修正回覆所用的言詞,以避免不必要的誤會 一起加油吧!! ※ 編輯: jacky1989 (111.250.187.173), 09/14/2016 02:16:38
CoNsTaR: 批評我助教就免了 學習是一定要的09/14 02:27
Sirctal: 大家是吃了火藥喔 好好談嘛 QQ 09/14 09:01
沒事的,只是認知出了一點問題而已 ※ 編輯: jacky1989 (101.14.134.38), 09/14/2016 10:27:14
askacis: 甚麼叫基本?你連gcc告訴你Error code都不願google一下 09/14 12:25
askacis: 還一廂情願的自以為是,要是我team的新人早就被我電了 09/14 12:25
askacis: 看了你的長篇大論跟你遇到問題表現出來的行為是兩回事 09/14 12:27
art1: 搞不懂在噓什麼,願意教別人吃魚已經是很佛心的教法了 09/14 13:45
yvb: 是教吃魚還是教用釣竿? 還是教 要吃魚一定要自己釣才好吃? :P 09/14 17:11
Caesar08: 教別人吃魚????? 09/14 17:22
wtchen: 大家發文注意語氣喔 09/14 18:13
CaptainH: 你學長是誰?一句廢話有什麼特別寫出來的必要? 09/15 03:12
CaptainH: 其實你只給code的話搞不好還不會有人噓XD 09/15 03:13
s0914714: 你開心就好 09/15 23:11
longlongint: 如果我工作壓力想找沙包打 09/18 02:51
longlongint: 我會去健身房 09/18 02:52
longlongint: 專案合作建議用通用的function 09/18 03:07
longlongint: 學習取向 如果有空可以刻一個 09/18 03:07
HolyBugTw: 關於你的code我有兩個建議...如果你想自己刻又清楚自己 09/19 10:52
HolyBugTw: 做什麼,那麼你迴圈起始條件就應該設好,何必以0起始? 09/19 10:53
HolyBugTw: 另外最後字串結束的\0不是一定要加,而是多數人習慣 09/19 10:53
HolyBugTw: 是變數使用前都會初始,memset之後又何必多此一舉 09/19 10:54
ronin728: 路過,朝聖 09/19 11:33
APTON: 這篇對工作人事或許沒用 但是對還有漫長路程的學生來說 09/22 13:55
APTON: 是個好練習阿 09/22 13:55
APTON: 而且問問題的人又沒說明問題的用途, 這樣回應有甚麼不好 09/22 13:56
b0920075: 我覺得以學習來說瞭解原理是很好的學習方式,但是懂了之 09/22 15:22
b0920075: 後能call就call吧,特別是有即刻需要的話還慢慢自己寫太 09/22 15:22
b0920075: 麻煩 09/22 15:22
abcsimps: 能理解當然是很好啦,但是工作怎麼可能什麼都讓你自己刻 09/26 14:30