作者: likuen 時間: 2016-7-15 14:45 標題: 有關 keil c , string to int 問題?
各位師兄,小弟有些事搞不清楚,情況如下。
char buffer[4];
經過RS232讀入字串並放入 buffer[]內,
例如: buffer[4] = {0x31,0x32,0x33,0x34} //即字串為"1234"
我想把buffer 的字串,改變成 十進制的1234,
是否其實 使用 buffer 就是等於 十進制的1234,
如果想把buffer 內清為"0",是否*buffer = '0' ; 即可。
因我搞不清字串,ASCII, int, 之間的關係。
希望各位師兄指點一下,我應該怎樣思考?
感謝。
作者: masseffect 時間: 2016-7-15 15:40
電腦嘅memory只係一堆bits
啲DATA TYPE、ASCII(string encoding) 只係將現實中嘅概念(例如string 同int) 同電腦memory嘅狀態來回轉換嘅方法
至於你個問題你話想將字串改變成十進制,到底係咩意思?
你個BUFF 入面嘅字,就已經係"十進制"嘅字串
而你要將BUFF 清為"0",可以用memset,如果你係用'0',只會set左個'0' 呢個character 入去
即係0x30
作者: marlin12 時間: 2016-7-15 17:55
本帖最後由 marlin12 於 2016-7-15 18:05 編輯
c語言的字元、字串、和ASCII,在這條link有解釋:
字元與字串http://dhcp.tcgs.tc.edu.tw/c/p009.htm
如果用c語言的字串來處理,buffer應該最少有5個字元。
char buffer[5] = "1234"; // 多1個字元來儲存最後的'\0'
或者
char buffer[] = "1234"; // 系統會自動計算要多少字元
或者
char buffer[] = {0x31,0x32,0x33,0x34,0x00};
把buffer的字串,轉為十進制的整數(integer)數字,可以用以下的stdlib.h的函數:
int val1 = atoi( buffer );
把buffer 的內容變為"0",可以用以下的string.h的函數:
strcpy( buffer, "0" );
作者: likuen 時間: 2016-7-15 22:39
回覆 3# marlin12
超感謝師兄指點,我會測試一下。再一次謝謝你。
作者: likuen 時間: 2016-7-15 22:42
回覆 2# masseffect
感謝師兄回答,本來我也以為 buffer 內就是十進制的 1234,但我寫
If (buffer == 1234)
{
.....
}
就是跳不進去,因為我非常混亂不清,所以在此求教。
作者: masseffect 時間: 2016-7-16 01:17
回覆 masseffect
感謝師兄回答,本來我也以為 buffer 內就是十進制的 1234,但我寫
If (buffer == 1234)
...
likuen 發表於 2016-7-15 22:42
首先...
電腦的記憶是沒有十進制的...
你可以理解為電腦的記憶是二進制
十進制,或者八進制,只是給你(人)看的
buffer 裡面,存的是一堆bits,你可以理解為一堆1/0
buffer是array現在對你來說有點難..可以先理解一個char
char 在C 裡是一個1BYTE的data type,也就是8bit
以"1" 這個字元來說,他的ASCII CODE是49
換成二進制是0011 0001,這個東西會存在於電腦的記憶體當中...
如果你以ascii去理解他,他就是一個"1" 的字元,如果你是以整數去理解他,他就是49這個數字
至於buffer== 1234
這是完全錯誤,第一buffer 是一個array
你在這裡buffer == 1234是在比較buffer 這個variable 的address和1234這個數字
正確做法是用strcmp(),而且你要比較的是"1234" 而不是1234
另外,正如上面所講,記得個array要有多一個位放'\0'
如果唔係有時會有意想不到嘅後果
作者: likuen 時間: 2016-7-17 10:02
回覆 6# masseffect
非常感謝,你這樣解釋,我了解多了我會再試試,再一次感謝。
作者: likuen 時間: 2016-7-18 15:35
各位師兄,經過你們指導,我已成功將字串轉換成功。原來我犯了array最後沒有加'\0'及計算錯 arrary的大少。
還想請教,如何可以將字串內特定位置抽出及放入 另一array內。
例如: buffer[] = "12345678";
運算後可得出如下:
data1 = "12";
data2 = "34";
data3 = "5678";
我試過用 stncpy,但只能從第一位開始複製到指定長度,我翻查期它指令,好像沒有字串向左移位的功能。(用 buffer<<=2; 及 _crol_ 均出現錯誤)
希望師兄能再指點。謝謝。
作者: skhui2005 時間: 2016-7-18 17:55
回覆 8# likuen
Try:
- char data = "12345678";
- char buff[64];
- int n1 = 0, n2 = 0, n3 = 0;
- printf("%d, %d, %d\n", n1, n2, n3); // 0, 0, 0
- n1 = atoi(strncpy(buff, data, 2));
- n2 = atoi(strncpy(buff, data + 2, 2));
- n3 = atoi(strncpy(buff, data + 4, 4));
- printf("%d, %d, %d\n", n1, n2, n3); // 12, 34, 5678
作者: likuen 時間: 2016-7-18 19:41
回覆 9# skhui2005
好聰明的計算法,我明天試試,謝謝你。
作者: likuen 時間: 2016-7-18 19:46
各位師兄,入門的書本我也看過了幾本,當然沒有融會貫通,可否給我一些方法或書本,使我可以靈活編程!
作者: skhui2005 時間: 2016-7-18 19:49
回覆 10# likuen
Sorry,
line 1 of the code should be:
- char data[] = "123456";
- n1 = atoi(strncpy(buff, data + 0, 2));
作者: marlin12 時間: 2016-7-18 21:45
本帖最後由 marlin12 於 2016-7-19 08:23 編輯
恕我直言,我真係唔覺得你睇過幾本書,你連pointer同array都搞唔掂,我覺得你應該找一些[C程式語言教學]的網站來看。
中文教電腦語言的書本,有啲寫得(或者翻釋得)很差。反而,在香港和台灣的電腦教育網站,有較好的程式語言教程。
如果你英文掂,就直接去看ansi c tutorial的網站,例如:
Interactive C tutorial
C Programming
如果要睇中文,就建議去看香港或台灣的教育網站的[c程式語言教程],例如:
C 語言線上中文資源
you are in C
學識基本野之後,最快增加功力的方法,便是看高手的程式和真實應用的project。
CodeProject
CSDN 知識庫
其實你用得keil C,相信你都係會去寫MCU。在MCU編程裏,還有資源的限制,實時多工系統的應用,和運用不同的軟體介面(protocol stack, socket service)和硬體介面,真係大把野要學。
Keil MCU tools
作者: likuen 時間: 2016-7-18 23:09
回覆 13# marlin12
師兄感謝你的分享,你講得沒有錯,我有好多方面仍未學懂,其實入門書我真的有看,在閱讀過程有些看了我以為明白了,但用起來就是不順,有些根本看了也不明白,所以我買了學習板回來實作,希望從實作學習。看作者的介紹的程式到真的自己想寫程式是有一定距離,加上我本身沒有甚麼根基,也沒有這方面的朋友或渠道發問。所以前進速度很慢。
謝謝你們的指導,我會再努力些。
作者: masseffect 時間: 2016-7-19 10:47
唔知你明左10進制2進制,同埋char 同int 之間嘅分別未..
但如果你要寫到下C 最基本嘅砌string
你要再睇多幾次書入面有關data type 同pointer嘅chapter
作者: snoopy11hk 時間: 2016-7-19 21:14
其實一定要睇, 同唯一要睇果 本係 k & r 的 C programming language
作者: likuen 時間: 2016-7-20 00:37
回覆 15# masseffect
我想我明白的,我會重讀你的指示。謝謝。
作者: likuen 時間: 2016-7-20 00:38
回覆 16# snoopy11hk
感謝師兄,我會參考一下。謝謝。

