一月21

TwSMS 發簡訊 (Linux C 版)

台灣簡訊(TwSMS)是國內一家線上傳簡訊的服務商,提供文字簡訊、語音簡訊等服務,價格也很合理,最重要的是有提供 API 介面,方便用戶在自己的程式中加入發送簡訊功能,官網已經有提供不少範例(PHP/ASP/JSP/Java/Perl/VB/BCB/Delphi),這邊也有 Ruby 的版本,不過就是沒看到 C 的,所以大略寫了一個 Linux C 版本,打算加入自己的嵌入式專題使用。
TwSMS 提供的 API 很簡單,只要由 HTTP 對 API server 發送 Request 即可,接著 server 就會回傳結果。程式先建立一個 socket 連線,然後發送簡訊,最後再擷取回傳碼檢查是否成功。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h> int main(){    /* TWSMS 相關設定 */    char *username = "username";   // 帳號    char *password = "password"; // 密碼    char *type = "now";        [...]


九月30

C 語言中 printf 的問題(續)

在前一篇當中提到了 printf 結果異常的問題,在睡前翻了一下手邊借來的「C Primer Plus」,沒想到就有提到這個問題,印象中其他書籍似乎都沒有講到,C Primer 系列果然是好書!
簡單來說就是 C 語言中,compiler 可以選擇先計算函數中的哪個參數,以增加編譯程式的效率,所以前一篇的例子:
printf("%d, %d", age, age++);
compiler 很可能會先算第二個參數,先改變了 num 數值,這樣就造成結果不如預期了。
在「C Primer Plus 5/e 中文精華版」第五章有寫道,遵循以下原則可以避免這些問題:

請勿在函數當中,對使用不止一次的參數使用遞增或遞減運算子。
請勿在運算式當中,對使用不止一次的變數使用遞增或遞減運算子。

第一點就是上面所說的例子,第二點的例子如下:
n = 3;y = n++ + n++;
在 C 標準中並沒有定義這行程式會如何執行,是哪一個先加 1 再運算,還是都先不加,造成了含糊不清的結果,應當避免這種寫法。

九月30

C 語言中 printf 的問題

今天有個學妹問我一個 C 程式的問題:下面程式的結果為何?
#include <stdio.h>int main(void){    int age = 20;    printf("You are now %d, and will be %d in one year", age, age++);    return 0 ;}
自認觀念還不錯的我直接就回答「20, 20」。但沒想到實際跑的答案竟然是「21, 20」,這真是出乎意料的結果啊!
馬上另外測試了其他有 printf 函式的語言,如 Java、PHP,結果也都是正確的「20, 20」,所以不知道是 C printf 的 bug 還是什麼原因,希望有人能解答。
請看:C 語言中 printf 的問題(續)

一月16

OpenGL-海龜作圖法

海龜作圖法(Turtle Graphics),意思是模仿海龜移動的方式,只能前進及左右轉,而將海龜的尾巴當作畫筆,可以放下及抬起。
本範例為二維空間,使用 OpenGL 搭配 C++ 實做。
程式功能介紹:
1、由 turtle.txt 檔案讀入作圖指令。
2、INIT - 設定海龜初始位置。(x 軸, y 軸, 龜頭角度)
3、PEN - 設定尾巴狀態。(0 抬起 / 1放下)
4、FW - 海龜向前移動。(移動長度)
5、RIGHT - 海龜右轉角度。(角度)
6、LEFT - 海龜左轉角度。(角度)

三月17

[OOP] - 第一章作業­

功能說明:
輸入長及寬 => 10 7
輸入邊框及填充字元 => C +
執行結果:
CCCCCCCCCC
C++++++++C
C++++++++C
C++++++++C
C++++++++C
C++++++++C
CCCCCCCCCC
程式實作: