查看完整版本 : C int to string , string to int 點解 run 唔到?

煙民母親生賤種 2017-9-8 07:38 PM

C int to string , string to int 點解 run 唔到?

唔用任何 C lib 的情況下, 自行重寫, 但 run 唔到, 何解?
注意,寫法唔可以 return pointer (char*) 之類。最好係成所有東西不涉及 pointer :fst_008:

[url=http://cpp.sh/85u77]http://cpp.sh/85u77[/url]

ghostkcleung 2017-9-8 08:56 PM

見到你段 code 係 include iostream,如果可以用 std 裡面嘅嘢…

[url]https://stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c[/url]
(呢樣我相信你唔會唔知)

又如果你講明唔用任何 Lib 純自己 rewrite 嘅話,最簡單就係 char array 裡面處理,但 1 個 array 本身已經涉及 pointer,所以無可能唔用 pointer。

jasonchan35 2017-9-8 09:49 PM

line 39:
> swap(*(str+start), *(str+end));
swap(str+start, str+end);

jasonchan35 2017-9-8 09:55 PM

[url]http://cpp.sh/9jrxa[/url]

不過 itoa() 最好俾埋 buffer size 入去, check buffer overflow

另一個舊式方法 return static variable 係唔建議, 因為 thread-safety issue
char* itoa(int num) {
  static char buf[64]; // <--- static variable, 如果唔加 static 就仲衰, 直頭會錯
  //........
  return buf;}

Susan﹏汪汪 2017-9-9 12:04 AM

Thread local storage

https://en.wikipedia.org/wiki/Thread-local_storage

jasonchan35 2017-9-9 12:19 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-9-9 12:04 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467505780&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
Thread local storage

https://en.wikipedia.org/wiki/Thread-local_storage [/quote]
TLS 係可以解決依個問題,不過最簡單直接都係 pass it buffer with size

tom.care 2017-9-9 03:08 AM

32 bit integer have a known number of digits, no need to think too much about it.
If you don't want to use pointer, you can have a global fixed size array, but that is really stupid.
寫 C 唔用 pointer 同寫 code 唔用手指一樣笨。

煙民母親生賤種 2017-9-9 06:22 AM

[quote]原帖由 [i]tom.care[/i] 於 2017-9-9 03:08 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=467511280&ptid=26912635][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
32 bit integer have a known number of digits, no need to think too much about it.
If you don't want to use pointer, you can have a global fixed size array, but that is really stupid.
寫 C 唔用 point ... [/quote]點解一定要用 pointer ? :fst_014:

jasonchan35 2017-9-9 09:11 AM

唔用 pointer 未用 std::string, 一樣可以, 只係慢 D
pass by reference  又得  ( itoa )
return std::string 又得 ( itoa2 )

[url]http://cpp.sh/9dha[/url]

Susan﹏汪汪 2017-9-9 10:07 AM

前面個stackoverflow 講左

[code]std::string s = std::to_string(42);[/code]

tom.care 2017-9-9 01:05 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-9-9 06:22 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=467513062&ptid=26912635][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
點解一定要用 pointer ? :fst_014:
[/quote]

冇人話一定要用!
我係話唔用蠢之嘛。

ghostkcleung 2017-9-9 01:54 PM

其實可唔可以講吓你想做啲乜?
點解好地地有現成嘢唔用,
要由頭開始寫,
而且盡量要全部用 Primitive type 完成。

如果唔用 Lib,我想 printf 都做唔到。

sswroom 2017-9-9 02:06 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 01:54 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=467530226&ptid=26912635][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
其實可唔可以講吓你想做啲乜?
點解好地地有現成嘢唔用,
要由頭開始寫,
而且盡量要全部用 Primitive type 完成。

如果唔用 Lib,我想 printf 都做唔到。 [/quote]
因為現成嘢非常慢.....
stdlib內, 差不多所有function, 我隨便寫都可以快過原本的很多......
例子: (LOOPCOUNT = 100000000)[code]        i = LOOPCOUNT;
        while (i-- > 0)
        {
                _itow(i, sbuff, 10);
        }[/code]stdlib用約3.7秒
自己寫的約用1.1秒

Susan﹏汪汪 2017-9-9 02:17 PM

[quote]原帖由 [i]sswroom[/i] 於 2017-9-9 02:06 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467530833&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

因為現成嘢非常慢.....
stdlib內, 差不多所有function, 我隨便寫都可以快過原本的很多......
例子: (LOOPCOUNT = 100000000)        i = LOOPCOUNT;
        while (i-- > 0)
        {
                _itow(i, sbuff, 10);
        }stdlib用約 ... [/quote]
煙民一定唔會考慮呢個原因

ghostkcleung 2017-9-9 03:26 PM

[quote]原帖由 [i]sswroom[/i] 於 2017-9-9 02:06 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467530833&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

因為現成嘢非常慢.....
stdlib內, 差不多所有function, 我隨便寫都可以快過原本的很多......
例子: (LOOPCOUNT = 100000000)        i = LOOPCOUNT;
        while (i-- > 0)
        {
                _itow(i, sbuff, 10);
        }stdlib用約 ... [/quote]

我諗人哋寫個 Standard 出嚟,除咗要快之外,仲需要考慮好多其他嘢,例如維護、無漏洞、Cross platform、要 compatible 其他 lib,個 code 人哋易睇得明…所以寫大件啲都係無可厚非。

除非有特別必要咁做,否則我從來唔會覺得 Stdlib 呢啲寫咗幾廿年,中間俾人修正住幾廿年嘅嘢,我 rewrite 會比佢更好。

如果取巧啲,可以用 sprintf/sscanf 透過 formatted string 將 int<->char* 互相轉換(甚至 float/double),咁樣我就符合只用 stdio 而唔用其他 lib,但當然呢個係取巧。

sswroom 2017-9-9 04:35 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 03:26 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=467534311&ptid=26912635][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]


我諗人哋寫個 Standard 出嚟,除咗要快之外,仲需要考慮好多其他嘢,例如維護、無漏洞、Cross platform、要 compatible 其他 lib,個 code 人哋易睇得明…所以寫大件啲都係 ... [/quote]我學C/C++的時候, C/C++是比其他語言慢, 至少比我之前寫開的程式慢........
還有, 別人寫的Library, 包括Standard Library, 很多時都不是最好的, 最好是自己寫。我之前寫過一個程式, Code Size不夠位放, 要將部分Function 放入第2 Section或第3 Section, 如果用Standard Library就不能這樣做, 只能在Main Section (Max 64KB per section)
還有, 很多Library, 包括Standard Library也不是Cross platform, 只有自己寫的Function才能確保是Cross platform

form5 2017-9-9 04:59 PM

一個人重寫c/c++ standard library,  吹下就得

ghostkcleung 2017-9-9 06:36 PM

樓主喺 C 裡面想做 Conversion ,
我剛才忽然其想諗起 Java 嘅 BigInteger,呢樣野喺 C/C++ 裡面 rewrite 可能有啲意思。

[[i] 本帖最後由 ghostkcleung 於 2017-9-9 08:36 PM 編輯 [/i]]

Susan﹏汪汪 2017-9-9 06:55 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 06:36 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467543317&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
樓主喺 C 裡面想做 conversation,
我剛才忽然其想諗起 Java 嘅 BigInteger,呢樣野喺 C/C++ 裡面 rewrite 可能有啲意思。 [/quote]
汪汪預到比較多的情況係檔案解碼

雖然用swift寫而唔係c++
但都係一樣

以json為例
解碼一個json係需要跟據下一個符號去做決定
如果出現[就係Array
出現{就係dictionary
出現"就係string

也當然、出現-.0~9呢D其中一個符號就係數字
解碼數字時不會預先知道數字有幾長

而因為好多string to integer的std function 都要某個結束方式先會正確解碼
常見的有\0做結束符或者pass個size入function

也所以有兩種方法
第一個方法係先scan一次抄個number出來
再傳入個string to integer的function
咁變左總共scan左兩次

第二個方法係自己寫個function
係一邊scan同時轉埋做integer
呢個就係要自己寫string to integer的原因

ghostkcleung 2017-9-9 08:57 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-9-9 06:55 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467544337&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

汪汪預到比較多的情況係檔案解碼

雖然用swift寫而唔係c++
但都係一樣

以json為例
解碼一個json係需要跟據下一個符號去做決定
如果出現[就係Array
出現{就係dictionary
出現"就係string

也當然、出現-.0~9呢D其中 ... [/quote]

一邊 Scan 一邊轉,即係逐粒 char 去 read 一下轉一下,對於 IO 嚟講,咁做反而係唔 efficient。所以第一個方法,scan 兩次反而會好啲。

Susan﹏汪汪 2017-9-9 09:31 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 08:57 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467551077&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


一邊 Scan 一邊轉,即係逐粒 char 去 read 一下轉一下,對於 IO 嚟講,咁做反而係唔 efficient。所以第一個方法,scan 兩次反而會好啲。 [/quote]
未必

IO可以係memory mapping 方式去做
系統會一個個page去處理

一個數字唔會佔好多bytes
大多都係位置同一個page內

所以多數mapped一個page 到ram之後就可以一粒粒char去讀

ghostkcleung 2017-9-9 09:39 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-9-9 09:31 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467553063&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

未必

IO可以係memory mapping 方式去做
系統會一個個page去處理

一個數字唔會佔好多bytes
大多都係位置同一個page內

所以多數mapped一個page 到ram之後就可以一粒粒char去讀 [/quote]

唔識,我只係學到開 1 個 stream,然後逐個 buffer 去 read 到尾然後 close。

Susan﹏汪汪 2017-9-9 10:59 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 09:39 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467553527&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


唔識,我只係學到開 1 個 stream,然後逐個 buffer 去 read 到尾然後 close。 [/quote]
簡單咁講

IO stream係一個順序的資料流
讀資料係順序咁讀、如果要回帶的話就需要set offset

Memory mapping 係不同的技術
只要map左file到指定的virtual memory address (即係不是真正load file入ram、只係預留一個address)
咁個address就同一般array一樣完全random access
你需要用到邊個位置系統就會把果個page自動load到ram

ghostkcleung 2017-9-9 11:21 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-9-9 10:59 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=467558171&ptid=26912635][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

簡單咁講

IO stream係一個順序的資料流
讀資料係順序咁讀、如果要回帶的話就需要set offset

Memory mapping 係不同的技術
只要map左file到指定的virtual memory address (即係不是真正load file入ram、只係預留一 ... [/quote]

好…我上網搵啲 Sample 睇。

頭先我試過 1 個 string 逐個 char 去 iterate,由於 '0' 即係 48,
最簡單係全部 char - 48 再加埋一齊,
結果仲慢。

[url]https://pastebin.com/9WQeX65x[/url]

Susan﹏汪汪 2017-9-9 11:34 PM

基本上汪汪寫左咁耐graphic 同相關的檔案處理
可以有一個結論

就係好似memory mapping呢種random access的能力
實用性上係遠遠超過IO stream技術

因為streaming 係有順序性
所以如果用stream方式做檔案處理、變相係需要順序解碼

但大型檔案係根本冇咁嘅空間同時間比你去咁做

就好似汪汪另一個字體檔post咁
如果汪汪用IO stream去順序咁完全解碼整個字體檔
一個中文字體檔可以包含三萬至六萬個字符
每個字符都起碼有十幾至百幾個指令

分分鐘完全解碼一個字體檔都會成幾GB資料塞晒係ram到

通常處理呢D大型檔案都離不開binary searching
也所以random access 的重要性係非常高

因為咁、字體檔個格式裡面都有定義好多sorted ranges用黎做binary search

結果就係根本就唔需要解碼成個字體檔
只要讀左個表之後
需要用邊隻字符先再針對果個位置做解碼
也睇得到random access嘅重要性有幾大

diego8 2017-10-31 12:30 PM

學C/C++的時候, C/C++是比其他語言慢, 至少比我之前寫開的程式慢, [url=https://jsonformatter-online.com/]JSON formatter[/url]

ncream 2017-10-31 12:45 PM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-9-9 06:36 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=467543317&ptid=26912635][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
樓主喺 C 裡面想做 Conversion ,
我剛才忽然其想諗起 Java 嘅 BigInteger,呢樣野喺 C/C++ 裡面 rewrite 可能有啲意思。 [/quote]c/c++有biginteger library,好多科研機構都用緊。[url=https://gmplib.org/]https://gmplib.org/[/url]
頁: [1]
查看完整版本: C int to string , string to int 點解 run 唔到?