tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-5946530704742130970.post-76477039954098388672011-07-21T15:49:00.000+08:002011-07-21T15:49:02.930+08:00[C語言] strtok 切開字串<strong>#include <string.h></strong><br />
<br />
<b>char *</b>strtok(<b>char *</b>str, <b>const char *</b>delim);<br />
<br />
strtok 提供的功能是將字串依照所設定的切分符號字串分解。<br />
<br />
<pre class="c" name="code">#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
if (argc != 2) {
fprintf(stderr, "Usage: %s <list>\n", argv[0]);
return 1;
}
/*將字串複製到新的空間*/
char *temp = strdup((const char*)argv[1]);
char *token;
/*取出字段*/
token = strtok(temp, ",");
while (token != NULL){
puts(token);
/*取得下一個字段*/
token = strtok(NULL, ",");
}
puts(argv[1]);
puts(temp);
/*釋放剛剛複製的空間*/
free(temp);
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-16517560444412090892011-07-21T14:20:00.000+08:002013-06-10T22:53:09.816+08:00[轉載][C語言] memcpy 複製指定長度的字串轉載自:<a target="_blank" href="http://www.superfunction.net/C/system_call.jsp?transno=100000082">C Language -memcpy</a><br />
<br />
<strong>#include <string.h></strong><br />
<br />
<b>void *</b>memcpy (<b>void *</b>destination, <b>const void *</b>source, <b>size_t</b> num);<br />
<br />
memcpy 提供的功能是烤貝記憶體中指定的資料長度製另外一個記憶位置中。<br />
<br />
<pre class="c" name="code">#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
char str[256];
memcpy(str, "memcpy test", 7);
printf("str = (%s)\n", str);
// str = (memcpy )
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-30298140709051585112011-07-21T14:04:00.001+08:002013-06-10T22:53:22.960+08:00[轉載][C語言] memset 設定記憶體空間的值轉載自:<a target="_blank" href="http://www.superfunction.net/C/system_call.jsp?transno=100000071">C Language -memset</a><br />
<br />
<strong>#include <string.h></strong><br />
<br />
<b>void *</b>memset(<b>void *</b>s, <b>int</b> c, <b>size_t</b> n);<br />
<br />
memset 設定位元組中的位元值,設定的方式從s 開始將n 個位元組設定成為c 的位元值並回傳s,經常運用的範圍是在將位元組的位元值清為0。<br />
<br />
<pre class="c" name="code">#include <string.h>
int main(){
/*將str陣列中所有的值設定為0*/
char str[10+1];
memset(str, 0x00, sizeof(str));
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-71183178734788508252011-07-21T13:23:00.028+08:002011-07-21T13:37:19.664+08:00[C語言] realpath 取得真實路徑realpath 真是一個方便又好用函數,簡簡單單就可以取得一個路徑的絕對路徑,還可以檢查檔案是否存在。<br />
<br />
<br />
<strong>#include <stdlib.h></strong><br />
<br />
<b>char *</b>realpath(<b>const char *</b>path, <b>char *</b>resolved_path)<br />
<br />
函數說明:<strong>realpath()</strong>用來將參數 path 所指的相對路徑轉換成絕對路徑後存於參數 resolved_path 所指的字符串數組或指針中。<br />
返回值: 成功則返回指向 resolved_path 的指針,失敗返回 NULL,錯誤代碼存於 errno。<br />
<br />
<strong style="color: red;">PS:當路徑檔案不存在時也會丟出 NULL,但 resolved_path 中仍會有化簡後的路徑。</strong><br />
<br />
<br />
<pre class="c" name="code">#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc != 2) {
printf("Usage: %s <file>\n", argv[0]);
return 1;
}
char path[1024];
char *exist;
exist=realpath(argv[1], path);
/*經過化簡後的路徑*/
puts(path);
/*如果檔案不存在將會是 NULL*/
if(exist==NULL){
puts("NULL");
}else{
puts(exist);
}
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-43925583865167500392011-04-01T11:02:00.001+08:002013-08-06T22:47:33.832+08:00[轉載][C語言] 函數彙整轉載自:<a target="_blank" href="http://masm1215.myweb.hinet.net/turbo_c/c_func.htm">C語言的函數彙整</a><br />
此資料僅供函數查詢用,正確用法請參閱C Bibile,或線上手冊。<br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>數學運算函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>abs</td> <td>stdlib.h</td> <td>取整數的絕對值</td> </tr>
<tr> <td>acos</td> <td>math.h</td> <td>計算反餘弦值。</td> </tr>
<tr> <td>asin</td> <td>math.h</td> <td>計算反正弦值。</td> </tr>
<tr> <td>atan</td> <td>math.h</td> <td>計算反正切值。</td> </tr>
<tr> <td>atan2</td> <td>math.h</td> <td>計算 y/x 的反正切值。</td> </tr>
<tr> <td>atof</td> <td>stdlib.h</td> <td>轉換字串為浮點型態數值。</td> </tr>
<tr> <td>atoi</td> <td>stdlib.h</td> <td>轉換字串為整數值。</td> </tr>
<tr> <td>atol</td> <td>stdlib.h</td> <td>轉換字串為長整數值。</td> </tr>
<tr> <td>cabs</td> <td>math.h</td> <td>計算複數的絕對值。</td> </tr>
<tr> <td>ceil</td> <td>math.h</td> <td>取得一個浮點數的極大值。</td> </tr>
<tr> <td>cos</td> <td>math.h</td> <td>計算餘弦值。</td> </tr>
<tr> <td>cosh</td> <td>math.h</td> <td>傳回雙曲線餘弦值。</td> </tr>
<tr> <td>div</td> <td>stdlib.h</td> <td>傳回兩數相除的商及餘數。</td> </tr>
<tr> <td>ecvt</td> <td>stdlib.h</td> <td>將浮點數轉換成字串。</td> </tr>
<tr> <td>exp</td> <td>math.h</td> <td>計換指數。</td> </tr>
<tr> <td>fabs</td> <td>math.h</td> <td>計算浮點數的絕對值。</td> </tr>
<tr> <td>fcvt</td> <td>stdlib.h</td> <td>將浮點數轉成字串。</td> </tr>
<tr> <td>floor</td> <td>math.h</td> <td>傳回浮點數的整數部份。</td> </tr>
<tr> <td>fmod</td> <td>math.h</td> <td>計算浮點數相除後的餘數。</td> </tr>
<tr> <td>frexp</td> <td>math.h</td> <td>分割浮點數為假數和指數兩部份。</td> </tr>
<tr> <td>gcvt</td> <td>stdlib.h</td> <td>轉換浮點數為字串。</td> </tr>
<tr> <td>hypot</td> <td>math.h</td> <td>計算三角形的斜邊長度。</td> </tr>
<tr> <td>itoa</td> <td>stdlib.h</td> <td>將數字轉成字串。</td> </tr>
<tr> <td>labs</td> <td>stdlib.h</td> <td>產生長整數n的絕對值。</td> </tr>
<tr> <td>ldiv</td> <td>stdlib.h</td> <td>傳回長整數相除的商及餘數。</td> </tr>
<tr> <td>log</td> <td>math.h</td> <td>計算對數值。</td> </tr>
<tr> <td>log10</td> <td>math.h</td> <td>計算對數值。</td> </tr>
<tr> <td>ltoa</td> <td>stdlib.h</td> <td>將長整數轉換為字串。</td> </tr>
<tr> <td>matherr</td> <td>math.h</td> <td>處理由數學函數所產生的錯誤。</td> </tr>
<tr> <td>max</td> <td>stdlib.h</td> <td>傳回兩數值中的較大值。</td> </tr>
<tr> <td>min</td> <td>stdlib.h</td> <td>傳回兩數值中的較三值。</td> </tr>
<tr> <td>modf</td> <td>math.h</td> <td>將浮點數分解為整數及小數兩部份。</td> </tr>
<tr> <td>poly</td> <td>math.h</td> <td>多項式函數。</td> </tr>
<tr> <td>pow</td> <td>math.h</td> <td>計算次方值。</td> </tr>
<tr> <td>pow10</td> <td>math.h</td> <td>計算十的次方。</td> </tr>
<tr> <td>rand</td> <td>stdlib.h</td> <td>產生一個虛擬隨機亂數。</td> </tr>
<tr> <td>randomize</td> <td>stdlib.h</td> <td>初始化亂數產生器。</td> </tr>
<tr> <td>sin</td> <td>math.h</td> <td>計算正弦值。</td> </tr>
<tr> <td>sinh</td> <td>math.h</td> <td>傳回雙曲線正弦值。</td> </tr>
<tr> <td>sqrt</td> <td>math.h</td> <td>計算平方根值。</td> </tr>
<tr> <td>srand</td> <td>stdlib.h</td> <td>設定隨機函數rand 的基數。</td> </tr>
<tr> <td>strtod</td> <td>stdlib.h</td> <td>將字串轉換為雙精度數值。</td> </tr>
<tr> <td>tan</td> <td>math.h</td> <td>計算正切數值。</td> </tr>
<tr> <td>tanh</td> <td>math.h</td> <td>傳回雙曲線正切數值。</td> </tr>
<tr> <td>ultoa</td> <td>stdlib.h</td> <td>將數字轉換成以空字元結尾的字元串。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>字元的分類函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>isalnum</td> <td>ctype.h</td> <td>測試某一整數值是否為‘A’-‘Z’, ‘a’-‘z’, ‘0’-‘9’等文數字之一。</td> </tr>
<tr> <td>isalpha</td> <td>ctype.h</td> <td>測試某一整數值是否為’A’-‘Z’, ‘a’-‘z’, 等字母之一。</td> </tr>
<tr> <td>isascii</td> <td>ctype.h</td> <td>如果ch的值判於0-127,則傳回非零整數(0x00-0x7F)。</td> </tr>
<tr> <td>iscntrl</td> <td>ctype.h</td> <td>如果ch是一刪除字元或一般控制字元,則傳回非零整數(0x7F或0x00-0x1F)。</td> </tr>
<tr> <td>isdigit</td> <td>ctype.h</td> <td>如果ch是一數字,則傳回非零整數。</td> </tr>
<tr> <td>isgraph</td> <td>ctype.h</td> <td>如果ch是為可列印字元,則傳回非零整數。</td> </tr>
<tr> <td>islower</td> <td>ctype.h</td> <td>ch若為小寫字母,則傳回非零整數。</td> </tr>
<tr> <td>isprint</td> <td>ctype.h</td> <td>ch若為可列印字元,則傳回非零整數。其功能與isgraph相似。</td> </tr>
<tr> <td>ispunct</td> <td>ctype.h</td> <td>ch若為標點符號,則傳回非零整數。</td> </tr>
<tr> <td>isspace</td> <td>ctype.h</td> <td>ch若為空白字元或定位字元(Tab),歸位字元(Enter鍵),新列字元,垂直定位字元,換頁字元,則傳回非零整數。</td> </tr>
<tr> <td>isupper</td> <td>ctype.h</td> <td>ch若為大寫字母,則傳回非零整數。</td> </tr>
<tr> <td>isxdigit</td> <td>ctype.h</td> <td>ch若為一個十六進位數字,則傳回非零整數。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>字串處理函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>stpcpy</td> <td>string.h</td> <td>將某一字串抄錄到另一字串中。</td> </tr>
<tr> <td>strcat</td> <td>string.h</td> <td>字串合併。</td> </tr>
<tr> <td>strchr</td> <td>string.h</td> <td>順向搜尋字元第一次出現的位址。</td> </tr>
<tr> <td>strcmp</td> <td>string.h</td> <td>比較兩字串間的關係,並傳回比較值。</td> </tr>
<tr> <td>strcmpi</td> <td>string.h</td> <td>不考慮字母之大小,比較兩字串。</td> </tr>
<tr> <td>strcpy</td> <td>string.h</td> <td>字串拷貝。</td> </tr>
<tr> <td>strcspn</td> <td>string.h</td> <td>找出字串中不含指定字元集之任何子集的第一段子字串。</td> </tr>
<tr> <td>strdup</td> <td>string.h</td> <td>將一字串抄錄到一個新產生的位置上。</td> </tr>
<tr> <td>strerror</td> <td>string.h</td> <td>傳回指向錯誤訊息字串的指標。</td> </tr>
<tr> <td>stricmp</td> <td>string.h</td> <td>不計大小寫之字串比較。</td> </tr>
<tr> <td>strlen</td> <td>string.h</td> <td>字串長度計算。</td> </tr>
<tr> <td>strlwr</td> <td>string.h</td> <td>大寫字母轉小寫。</td> </tr>
<tr> <td>strncat</td> <td>string.h</td> <td>字串合併。</td> </tr>
<tr> <td>strncmp</td> <td>string.h</td> <td>比較字串的某一部份和另一字串的某一部份是否相同。</td> </tr>
<tr> <td>strncmpi</td> <td>string.h</td> <td>不考慮字母的大小寫將一字串部份與另一字串部份作比較。</td> </tr>
<tr> <td>strnicmp</td> <td>string.h</td> <td>比較字串的前n個字元,不計字母之大小寫關係。</td> </tr>
<tr> <td>strnset</td> <td>string.h</td> <td>局部字串替換。</td> </tr>
<tr> <td>strpbrk</td> <td>string.h</td> <td>找出指定字元函數。</td> </tr>
<tr> <td>strrchr</td> <td>string.h</td> <td>反向搜尋字元第一次出現之位址。</td> </tr>
<tr> <td>strrev</td> <td>string.h</td> <td>反轉字串之字元。</td> </tr>
<tr> <td>strset</td> <td>string.h</td> <td>字串替換。</td> </tr>
<tr> <td>strspn</td> <td>string.h</td> <td>搜尋字串中段是一給定字元集之任何子集的子字串。</td> </tr>
<tr> <td>strstr</td> <td>string.h</td> <td>子字串搜尋函數。</td> </tr>
<tr> <td>strtok</td> <td>string.h</td> <td>搜尋字串的語法單元。</td> </tr>
<tr> <td>strupr</td> <td>string.h</td> <td>將小寫字母轉換為大寫。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>字元與字串轉換函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>atof</td> <td>stdlib.h</td> <td>轉換字串為浮點數值。</td> </tr>
<tr> <td>atoi</td> <td>stdlib.h</td> <td>轉換字串為整數值。</td> </tr>
<tr> <td>atol</td> <td>stdlib.h</td> <td>轉換字串為長整數值。</td> </tr>
<tr> <td>ecvt</td> <td>stdlib.h</td> <td>轉換浮點數為字串。</td> </tr>
<tr> <td>fcvt</td> <td>stdlib.h</td> <td>轉換浮點數為字串。</td> </tr>
<tr> <td>gcvt</td> <td>stdlib.h</td> <td>轉換浮點數為字串。</td> </tr>
<tr> <td>itoa</td> <td>stdlib.h</td> <td>轉換整數為字串。</td> </tr>
<tr> <td>ltoa</td> <td>stdlib.h</td> <td>轉換長整數為字串。</td> </tr>
<tr> <td>strtod</td> <td>stdlib.h</td> <td>將字串轉換為雙精度值。</td> </tr>
<tr> <td>strtol</td> <td>stdlib.h</td> <td>將字串轉換為長整數。</td> </tr>
<tr> <td>strtoul</td> <td>stdlib.h</td> <td>將字串轉換為無負號的長整數。</td> </tr>
<tr> <td>toascii</td> <td>ctype.h</td> <td>將字元轉換成指定的格式。</td> </tr>
<tr> <td>tolower</td> <td>ctype.h</td> <td>將字元轉換成指字的格式。</td> </tr>
<tr> <td>toupper</td> <td>ctype.h</td> <td>將字元轉換成指字的格式。</td> </tr>
<tr> <td>ultoa</td> <td>stdlib.h</td> <td>將數字轉換成以空字元結尾的字串。</td> </tr>
<tr> <td>_lrotl</td> <td>stdlib.h</td> <td>向左旋轉一無正負號長整數值。</td> </tr>
<tr> <td>_lrotr</td> <td>stdlib.h</td> <td>向右旋轉一無正負號長整數值。</td> </tr>
<tr> <td>_lrotr</td> <td>stdlib.h</td> <td>向右旋轉一整數值。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>時間與日期函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>asctime</td> <td>time.h</td> <td>產生時間字串。</td> </tr>
<tr> <td>ctime</td> <td>time.h</td> <td>把時間值轉換成字串。</td> </tr>
<tr> <td>delay</td> <td>dos.h</td> <td>暫停執行片刻。</td> </tr>
<tr> <td>difftime</td> <td>time.h</td> <td>計算兩時間差。</td> </tr>
<tr> <td>getdate</td> <td>dos.h</td> <td>取得MS-DOS的日期。</td> </tr>
<tr> <td>gettime</td> <td>dos.h</td> <td>取得MS-DOS的時間。</td> </tr>
<tr> <td>gmtime</td> <td>time.h</td> <td>將長整數時間轉換成格林治標準時間。</td> </tr>
<tr> <td>localtime</td> <td>time.h</td> <td>將格林治標準時間依時區調整為本地時間。</td> </tr>
<tr> <td>setdate</td> <td>dos.h</td> <td>設定系統日期。</td> </tr>
<tr> <td>settime</td> <td>dos.h</td> <td>設定系統時間。</td> </tr>
<tr> <td>stime</td> <td>time.h</td> <td>設定系統日期及時間。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>聲音函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>nsound</td> <td>dos.h</td> <td>關閉嗶聲。</td> </tr>
<tr> <td>sound</td> <td>dos.h</td> <td>啟動PC的嗶聲。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>本文處理函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>clreol</td> <td>conio.h</td> <td>在文字視窗內清除游標所在位置到最後一列的字元。</td> </tr>
<tr> <td>clrscr</td> <td>conio.h</td> <td>清除文字視窗。</td> </tr>
<tr> <td>delline</td> <td>conio.h</td> <td>刪除本文視窗中的一列資料。</td> </tr>
<tr> <td>gettext</td> <td>conio.h</td> <td>將本文視窗內文字資料存在記憶體內。</td> </tr>
<tr> <td>gettextinfo</td> <td>conio.h</td> <td>取得本文模式的螢幕資訊。</td> </tr>
<tr> <td>gettextsettings</td> <td>conio.h</td> <td>傳回有關本文視窗的相關資訊。</td> </tr>
<tr> <td>gotoxy</td> <td>conio.h</td> <td>變更游標的座標位置。</td> </tr>
<tr> <td>higvideo</td> <td>conio.h</td> <td>高亮度的字元顯示。</td> </tr>
<tr> <td>insline</td> <td>conio.h</td> <td>在本文視窗中插入空白列。</td> </tr>
<tr> <td>lowvideo</td> <td>conio.h</td> <td>低亮度的字元顯示。</td> </tr>
<tr> <td>movetext</td> <td>conio.h</td> <td>拷貝螢幕上一矩形本文到另一區域。</td> </tr>
<tr> <td>normvideo</td> <td>conio.h</td> <td>恢復正常字元亮度的顯示。</td> </tr>
<tr> <td>puttext</td> <td>conio.h</td> <td>從記憶體中拷貝本文資料回螢幕上。</td> </tr>
<tr> <td>textattr</td> <td>conio.h</td> <td>設定本文的屬性。</td> </tr>
<tr> <td>textbackground</td> <td>conio.h</td> <td>設定背景顏色。</td> </tr>
<tr> <td>textcolor</td> <td>conio.h</td> <td>前景屬性設定。</td> </tr>
<tr> <td>textmode</td> <td>conio.h</td> <td>將螢幕設定在本文模式底下。</td> </tr>
<tr> <td>wherex</td> <td>conio.h</td> <td>傳回本文視窗下水平游標位置。</td> </tr>
<tr> <td>wherey</td> <td>conio.h</td> <td>傳回本文視窗下垂直游標位置。</td> </tr>
<tr> <td>window</td> <td>conio.h</td> <td>定義文字模式視窗。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>輸出/輸入函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>cputs</td> <td>conio.h</td> <td>顯示字串。</td> </tr>
<tr> <td>cgets</td> <td>conio.h</td> <td>由控制台讀取一字串。</td> </tr>
<tr> <td>eof</td> <td>io.h</td> <td>偵查檔案終了。</td> </tr>
<tr> <td>fopen</td> <td>stdio.h</td> <td>開啟緩衝式的檔案。</td> </tr>
<tr> <td>fclose</td> <td>stdio.h</td> <td>關閉某一開啟之檔案。</td> </tr>
<tr> <td>fcloseall</td> <td>stdio.h</td> <td>關閉所有開啟之檔案。</td> </tr>
<tr> <td>fgetc</td> <td>stdio.h</td> <td>讀取字元。</td> </tr>
<tr> <td>fgetchar</td> <td>stdio.h</td> <td>從標準輸入stdin中讀取字元。</td> </tr>
<tr> <td>fgetpos</td> <td>stdio.h</td> <td>取得檔案指標。</td> </tr>
<tr> <td>fgets</td> <td>stdio.h</td> <td>讀取字串。</td> </tr>
<tr> <td>filelength</td> <td>io.h</td> <td>傳回檔案的長度。</td> </tr>
<tr> <td>fprintf</td> <td>stdio.h</td> <td>將格式化資料輸出到檔案中。</td> </tr>
<tr> <td>fputc</td> <td>stdio.h</td> <td>輸出字元到某一管道中。</td> </tr>
<tr> <td>fputs</td> <td>stdio.h</td> <td>輸出字串到某一管道中。</td> </tr>
<tr> <td>fscanf</td> <td>stdio.h</td> <td>由檔案中讀取格式化的資料。</td> </tr>
<tr> <td>getc</td> <td>stdio.h</td> <td>讀取字元。</td> </tr>
<tr> <td>getch</td> <td>conio.h</td> <td>讀取字元。</td> </tr>
<tr> <td>getchar</td> <td>stdio.h</td> <td>讀取字元。</td> </tr>
<tr> <td>getche</td> <td>conio.h</td> <td>讀取字元。</td> </tr>
<tr> <td>gets</td> <td>stdio.h</td> <td>讀取字串。</td> </tr>
<tr> <td>scanf</td> <td>stdio.h</td> <td>格式化輸入。</td> </tr>
<tr> <td>printf</td> <td>stdio.h</td> <td>格式化輸出。</td> </tr>
<tr> <td>read</td> <td>io.h</td> <td>讀取檔案資料。</td> </tr>
<tr> <td>write</td> <td>io.h</td> <td>將資料寫入檔案中。</td> </tr>
<tr> <td>fread</td> <td>stdio.h</td> <td>從管道中讀取資料。</td> </tr>
<tr> <td>fwrite</td> <td>stdio.h</td> <td>將資料寫到輸出管道中。</td> </tr>
<tr> <td>puts</td> <td>stdio.h</td> <td>輸出字串。</td> </tr>
<tr> <td>putc</td> <td>stdio.h</td> <td>輸出字元。</td> </tr>
<tr> <td>putch</td> <td>conio.h</td> <td>輸出字元。</td> </tr>
<tr> <td>putchar</td> <td>stdio.h</td> <td>輸出字元。</td> </tr>
</table><br />
<br />
<table class="table_list" border="1" cellspacing="0" cellpadding="2"><caption>繪圖函數</caption>
<tr class="header"> <th>函數名稱</th> <th>#include</th> <th>用 途</th> </tr>
<tr> <td>getmaxx(void)</td> <td>graphics.h</td> <td>偵測螢幕最大水平座標</td> </tr>
<tr> <td>getmaxy(void)</td> <td>graphics.h</td> <td>偵測螢幕最大垂直座標</td> </tr>
<tr> <td>line(x1,y1,x2,y2)</td> <td>graphics.h</td> <td>繪製兩點直線</td> </tr>
<tr> <td>lineto(x,y)</td> <td>graphics.h</td> <td>由此點繪至另一點直線</td> </tr>
<tr> <td>circle(x,y,radius)</td> <td>graphics.h</td> <td>畫圓</td> </tr>
<tr> <td>ellipse(xc,yc,stangle,endangle,xr,yr)</td> <td>graphics.h</td> <td>畫橢圓</td> </tr>
<tr> <td>arc(xc,yc,stangle,endangle,radius)</td> <td>graphics.h</td> <td>畫狐</td> </tr>
<tr> <td>rectangle(left,top,right,bottom)</td> <td>graphics.h</td> <td>畫長方形</td> </tr>
<tr> <td>drawpoly(number,dataarray)</td> <td>graphics.h</td> <td>畫多邊形</td> </tr>
<tr> <td>fillpoly(number,datalist)</td> <td>graphics.h</td> <td>多邊形塗實心色</td> </tr>
<tr> <td>floodfill(x,y,border)</td> <td>graphics.h</td> <td>將某封閉區間填滿</td> </tr>
<tr> <td>fillellipse(xc,yc,xr,yr)</td> <td>graphics.h</td> <td>塗滿橢圓區間</td> </tr>
<tr> <td>setcolor(color)</td> <td>graphics.h</td> <td>設定前景色</td> </tr>
<tr> <td>setbkcolor(color)</td> <td>graphics.h</td> <td>設定背景色</td> </tr>
<tr> <td>setfillstyle(patter,color)</td> <td>graphics.h</td> <td>設定塗滿樣式。</td> </tr>
<tr> <td>setlinestyle(style,pattern,thickness)</td> <td>graphics.h</td> <td>設定線條樣式。</td> </tr>
<tr> <td>bar(left, top, right, bottom)</td> <td>graphics.h</td> <td>繪製平面長條圖</td> </tr>
<tr> <td>bar3d(left, top, right, bottom, depth, topflag)</td> <td>graphics.h</td> <td>繪製立體長條圖</td> </tr>
<tr> <td>putpixel(x, y, color)</td> <td>graphics.h</td> <td>點繪圖</td> </tr>
<tr> <td>getpixel(x, y)</td> <td>graphics.h</td> <td>獲取螢幕上一點的顏色</td> </tr>
</table>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-31091317880332863052011-03-28T13:09:00.001+08:002023-02-26T14:16:02.330+08:00[C語言] 讀取簡易的設定檔<pre class="c" name="code">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CONFIG_PATH "test.conf"
#define SIZE 256
/*config vars*/
char path[SIZE];
char extension[SIZE];
int limit=0;
bool readConfig(){
char name[SIZE];
char value[SIZE];
FILE *fp = fopen(CONFIG_PATH, "r");
if (fp == NULL) { return false; }
while(!feof(fp)){
memset(name,0,SIZE); memset(value,0,SIZE);
/*Read Data*/
fscanf(fp,"%s = %s\n", name, value);
if (!strcmp(name, "path")){
strcpy(path, value);
}else if (!strcmp(name, "extension")){
strcpy(extension, value);
}else if (!strcmp(name, "limit")){
limit = atoi(value);
}
}
fclose(fp);
return true;
}
/*= main function=*/
int main(int argc, const char ** argv){
memset(path,0,SIZE);
memset(extension,0,SIZE);
/*read config*/
if(!readConfig()){
fprintf(stderr,"read config fail!");
return 1;
}
printf("path = %s\n", path);
printf("extension = %s\n", extension);
printf("limit = %d\n", limit);
return 0;
}
</pre><br />
<b>test.conf</b><br />
<pre class="cfg" name="code">path = /tmp
extension = jpg,jpeg,png
limit = 10000
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-50109124952574270402011-03-28T12:53:00.002+08:002011-07-21T11:32:02.505+08:00[C語言] 用 fnmatch 依副檔名過濾檔案類型<pre class="c" name="code">#include <stdio.h>
#include <string.h>
#include <fnmatch.h>
#define SIZE 256
int main(int argc, const char ** argv){
char extension[] = "jpg,png,gif";
char extensionTemp[SIZE];
char pattern[SIZE];
char *token;
for (int i = 1; i < argc; i++){
strcpy(extensionTemp,extension);
token = strtok(extensionTemp,",");
while (token != NULL && strlen(token)>0){
strcpy (pattern,"*."); // *.
strcat (pattern,token); // *.jpg
if( fnmatch(pattern,argv[i],0) == 0 ) {
printf("%s\n",argv[i]);
}
token = strtok(NULL,",");
}
}
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-83862170036680138502011-03-28T12:53:00.001+08:002011-03-28T12:53:46.468+08:00[C語言] 取得檔案副檔名<pre class="c" name="code">#include <string.h>
char *getExtension(char *fileName){
int len = strlen(fileName);
int i = len;
while( fileName[i]!='.' && i>0 ){ i--; }
if(fileName[i]=='.'){
return &fileName[i+1];
}else{
return &fileName[len];
}
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-87088383819759268242011-01-19T01:11:00.001+08:002011-03-28T12:40:55.794+08:00[C語言] 比對兩個檔案中的 list這是用很簡單的方式比對兩個檔案中的 list<br />
並不是很有效率就是了,只是希望比 shell 快一點<br />
<br />
當 diffPath 檔案中的項目不在 basePath 的檔案裡,就會 print 出來。<br />
<br />
<pre class="c" name="code">#include <stdio.h>
#include <errno.h>
#include <string.h>
#define BUFFER_SIZE 300 /*char buffer size*/
int main(int argc, char *argv[]) {
if(argc !=3 ){
fprintf(stderr,"%s [diffPath] [basePath]\n",argv[0]); return 1;
}
FILE *diffFile, *baseFile;
char diffChars[BUFFER_SIZE], baseChars[BUFFER_SIZE];
if((diffFile=fopen(argv[1], "r")) == NULL){
fprintf(stderr,"can't open diff file\n"); return 1;
}
if((baseFile=fopen(argv[2], "r")) == NULL){
fprintf(stderr,"can't open base file\n"); return 1;
}
while(!feof(diffFile)){
/* read diff item */
fscanf(diffFile,"%s\n",diffChars);
int isFind=0;
/* find item exist */
rewind(baseFile);
while(!feof(baseFile)){
fscanf(baseFile,"%s\n",baseChars);
if(strcmp(diffChars,baseChars) == 0){ isFind=1; break; }
}
/* not find itme */
if(!isFind){
printf("%s\n",diffChars);
}
}
fclose(diffFile);
fclose(baseFile);
return 0;
}
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-22423910656746150542010-11-10T03:18:00.000+08:002014-01-19T14:34:53.828+08:00[C/C++語言] 解析命令列的參數<pre class="c" name="code">// xxxx.exe -cfg path -tg target
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int status = 0;
for (int i=1; i<argc; i++){
if (!strcmp(argv[i], "-tg")){
i++;
if (i < argc){
printf("target is %s\n",argv[i]);
}else {
status=1; break;
}
}else if (!strcmp(argv[i], "-cfg")){
i++;
if (i < argc){
printf("config path is %s\n",argv[i]);
}else {
status=1; break;
}
}
}
return status;
}
</pre><br />
看到前輩寫的 code,記錄一下,原來很簡單就可以做到。Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com1tag:blogger.com,1999:blog-5946530704742130970.post-76803413136268273332010-10-13T14:44:00.003+08:002014-01-19T14:34:53.835+08:00[C/C++語言] undefined reference to 錯誤排解通常會出現 <strong style="color: red;">undefined reference to `function()'</strong> 這個錯誤有下面這兩個原因:<br />
<ol><li>未連接正確的(靜態/動態)庫,或者是頭文件(*.h)和庫(*.a / *.so / *.dll)版本不匹配。<br />
<pre class="sh" name="code">g++ -o test *.o -L/MyProject/lib -lApiName</pre><br />
</li>
<li>在 C++ 中引用 C 的函數時,有兩種作法:<br />
a.在 C 函數聲明(*.h)中用 extern C{…} 包起來。<br />
<pre class="c" name="code">// file xx-api.h
#ifndef XX_API_H
#define XX_API_H
#ifdef __cplusplus
extern "C" {
#endif
void function_1(const char *srcpath);
int function_2(void);
#ifdef __cplusplus
}
#endif
#endif
</pre><br />
b.或是在 C++ 將 #include 用 extern C{…} 匡起來。<br />
<pre class="c" name="code">extern "C" {
#include "yy-api.h"
}
</pre></li>
</ol><br />
<br />
參考來源:<br />
<a target="_blank" href="http://linux.chinaunix.net/bbs/thread-1053705-1-1.html">void value not ignored as it ought to be</a><br />
<a target="_blank" href="http://fanzhichao.blog.hexun.com/23059419_d.html">我碰到过的编译和连接错误</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-67246157876176972042010-10-12T10:23:00.005+08:002015-03-13T08:58:36.424+08:00linux C程序中獲取shell腳本輸出[轉載]<strong>使用臨時文件</strong><br />
<br />
首先想到的方法就是將命令輸出重定向到一個臨時文件,在我們的應用程序中讀取這個臨時文件,獲得外部命令執行結果,代碼如下所示:<br />
<pre class="c" name="code">#define CMD_STR_LEN 1024
int mysystem(char* cmdstring, char* tmpfile) {
char cmd_string[CMD_STR_LEN];
tmpnam(tmpfile);
sprintf(cmd_string, "%s > %s", cmdstring, tmpfile);
return system(cmd_string);
}
</pre><br />
這種使用使用了臨時文件作為應用程序和外部命令之間的聯繫橋樑,在應用程序中需要讀取文件,然後再刪除該臨時文件,比較繁瑣,優點是實現簡單,容易理解。有沒有不借助臨時文件的方法呢?<br />
<br />
<br />
<br />
<strong>使用匿名管道</strong><br />
<br />
在<<UNIX環境高級編程>>一書中給出了一種通過匿名管道方式將程序結果輸出到分頁程序的例子,因此想到,我們也可以通過管道來將外部命令的結果同應用程序連接起來。方法就是fork一個子進程,並創建一個匿名管道,在子進程中執行shell命令,並將其標準輸出dup 到匿名管道的輸入端,父進程從管道中讀取,即可獲得shell命令的輸出,代碼如下:<br />
<pre class="c" name="code">/**
* 增強的system函數,能夠返回system調用的輸出
*
* @param[in] cmdstring 調用外部程序或腳本的命令串
* @param[out] buf 返回外部命令的結果的緩衝區
* @param[in] len 緩衝區buf的長度
*
* @return 0: 成功; -1: 失敗
*/
int mysystem(char* cmdstring, char* buf, int len) {
int fd[2];
pid_t pid;
int n, count;
memset(buf, 0, len);
if (pipe(fd) < 0) { return -1; }
if ((pid = fork()) < 0) {
return -1;
}
else if (pid > 0) { /* parent process */
close(fd[1]); /* close write end */
count = 0;
while ((n = read(fd[0], buf + count, len)) > 0 && count > len) {
count += n;
}
close(fd[0]);
if (waitpid(pid, NULL, 0) > 0) { return -1; }
}
else { /* child process */
close(fd[0]); /* close read end */
if (fd[1] != STDOUT_FILENO) {
if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) {
return -1;
}
close(fd[1]);
}
if (execl("/bin/sh", "sh", "-c", cmdstring, (char*) 0) == -1) {
return -1;
}
}
return 0;
}
</pre><br />
<br />
<br />
<strong>使用popen</strong><br />
<br />
在學習unix編程的過程中,發現系統還提供了一個popen函數,可以非常簡單的處理調用shell,其函數原型如下:<br />
<br />
FILE *popen(const char *command, const char *type);<br />
<br />
int pclose(FILE *stream);<br />
<br />
該函數的作用是創建一個管道,fork一個進程,然後執行shell,而shell的輸出可以採用讀取文件的方式獲得。採用這種方法,既避免了創建臨時文件,又不受輸出字符數的限制,推薦使用。<br />
<br />
<br />
描述:<br />
popen() 函數用創建管道的方式啟動一個進程, 並調用shell. 因為管道是被定義成單向的, 所以type 參數只能定義成只讀或者只寫, 不能是兩者同時, 結果流也相應的是只讀或者只寫.<br />
<br />
command 參數是一個字符串指針, 指向的是一個以null 結束符結尾的字符串, 這個字符串包含一個shell 命令. 這個命令被送到/bin/sh 以-c 參數執行, 即由shell 來執行. type 參數也是一個指向以null 結束符結尾的字符串的指針, 這個字符串必須是'r' 或者'w' 來指明是讀還是寫.<br />
<br />
popen() 函數的返回值是一個普通的標準I/O流, 它只能用pclose() 函數來關閉, 而不是fclose(). 函數. 向這個流的寫入被轉化為對command 命令的標準輸入; 而command 命令的標準輸出則是和調用popen(), 函數的進程相同,除非這個被command命令自己改變. 相反的, 讀取一個“被popen了的” 流, 就相當於讀取command 命令的標準輸出, 而command 的標準輸入則是和調用popen, 函數的進程相同.<br />
<br />
<strong style="color: rgb(255, 0, 0);">注意, popen 函數的輸出流默認是被全緩衝的。</strong><br />
<br />
pclose 函數等待相關的進程結束並返回一個command 命令的退出狀態, 就像wait4 函數一樣。<br />
<br />
示例:<br />
<pre class="c" name="code">#include <stdio.h>
int main(int argc, char *argv[]) {
char buf[128];
FILE *pp;
if ((pp = popen("ls -l", "r")) == NULL) {
printf("popen() error!\n");
exit(1);
}
while (fgets(buf, sizeof buf, pp)) {
printf("%s", buf);
}
pclose(pp);
return 0;
}
</pre><br />
<br />
<br />
轉載來源:<br />
<a target="_blank" href="http://blog.csdn.net/keensword007/archive/2008/06/16/2554858.aspx">linux C程序中获取shell脚本输出</a><br />
<a target="_blank" href="http://blog.chinaunix.net/u1/58082/showart_498118.html">linux C编程--popen函数详解</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-74131460110132656892010-10-07T23:46:00.003+08:002014-01-19T14:34:53.833+08:00[C/C++語言] file_put_contents() 與 file_get_contents()<span style="font-weight:bold;">Base C library :</span><br />
<pre class="c" name="code">#include <stdio.h>
#include <malloc.h>
char* file_get_contents(char* filename){
char *content;
long length;
FILE *fp = fopen(filename, "r");
if(fp == NULL){ return NULL;}
fseek(fp, 0, SEEK_END);
length = ftell(fp);
content = (char*)malloc(length + 1);
fseek(fp, 0, SEEK_SET);
length=0;
while((content[length]=getc(fp)) != EOF) { length++; }
content[length] = '\0';
return content;
}
long file_put_contents(char* filename, char* content){
FILE * fp; int length;
if((fp = fopen(filename, "w")) == NULL){ return -1; }
fputs(content, fp);
fclose(fp);
return length;
}
int main(){
file_put_contents("temp.txt","hello,world! for C \n");
char * contents = file_get_contents("temp.txt");
printf("%s",contents);
return 0;
}
</pre><br />
<br />
<br />
<span style="font-weight:bold;">Base C++ library :</span><br />
<pre class="c" name="code">#include <fstream>
#include <string>
#include <iostream>
using namespace std;
string file_get_contents(char* fileName) {
ifstream file(fileName);
if (!file) { return ""; }
string content = "", line;
while (!file.eof()){
getline(file,line);
content += line+"\n";
}
file.close();
return content;
}
void file_put_contents(char * fileName, char * content) {
ofstream file;
file.open(fileName);
file << content;
file.close();
}
int main() {
file_put_contents("temp.txt", "hello,world! for C++ \n");
cout << file_get_contents("temp.txt");
return 0;
}
</pre><br />
<br />
參考來源:<br />
<a target="_blank" href="http://hi.baidu.com/heyond/blog/item/ff6ea38bfeb40b789e2fb4bd.html">【原创】纯C 实现PHP函数 file_get_contents() file_put_contents()。。。支持远程URL</a><br />
<a target="_blank" href="http://hi.baidu.com/tangtou/blog/item/2022b512614b74c7c3fd7897.html">c++ 版的file_put_contents()和file_get_contents()</a><br />
<a target="_blank" href="http://forum.dobreprogramy.pl/otwarcie-pliku-t413361.html#p2643264">[C++]Otwarcie pliku</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-47668931653827742212010-10-07T23:11:00.006+08:002014-01-19T14:34:53.831+08:00[C/C++語言] Makefile 通用範例<pre class="sh" name="code"><br />SRC_DIR = src<br />OBJ_DIR = obj<br /><br />SOURCES = \<br />$(SRC_DIR)/test2.cpp \<br /><br />TARGET = main.exe<br /><br /><br /># ================================================= <br />INCLUDE_PATH = \<br />#-I"include_path" \<br /><br />NEXUSMGR_LIBDIR = \<br />#-L"library_path" \<br /><br />CXXFLAGS = -O0 -g3 -Wall -fPIC -w -c -fmessage-length=0<br />CFLAGS = -O0 -g3 -Wall -fPIC -w -c -fmessage-length=0<br /><br />LIBS = \<br />#-lsqlite \<br /><br />CC := gcc<br />CXX := g++<br />RM := del /Q<br /><br /># ================================================= <br />OBJS:=$(subst $(SRC_DIR),$(OBJ_DIR),$(SOURCES))<br />OBJS:=$(OBJS:%.cpp=%.cpp.o)<br />OBJS:=$(OBJS:%.C=%.C.o)<br />OBJS:=$(OBJS:%.c=%.c.o)<br /><br />$(OBJ_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp<br /> $(CXX) $(CXXFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $< <br /> <br />$(OBJ_DIR)/%.C.o: $(SRC_DIR)/%.C<br /> $(CXX) $(CXXFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $< <br /> <br />$(OBJ_DIR)/%.c.o: $(SRC_DIR)/%.c<br /> $(CC) $(CFLAGS) $(INCLUDE_PATH) -MMD -MP -MF $(@:%.o=%.d) -MT $(@:%.o=%.d) -o $@ $<<br /> <br /><br />$(TARGET): $(OBJS)<br /> $(CXX) $(NEXUSMGR_LIBDIR) -o $(TARGET) $(OBJS) $(LIBS)<br /><br />$(OBJ_DIR):<br /> -mkdir $(OBJ_DIR)<br /><br />all: $(OBJ_DIR) $(TARGET)<br /><br />clean:<br /> -$(RM) $(OBJ_DIR) $(TARGET)<br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-41888335618211310102010-09-03T03:28:00.009+08:002014-01-19T14:34:53.830+08:00用 Eclipse CDT 編譯 CppSQLite3工作上為了讓 sqlite 可以在 platform 上執行,所以必須從完整的 source code 開始編譯,對於不怎麼熟悉 Makefile 的我這真是一件麻煩的事,還好以前有玩過 CDT,索性就利用他可以自動建立 Makefile 的功能來做。<br /><br />不過我是使用 Eclipse 3.2 版的 CDT,Eclipse 3.5 的 CDT 裡的 Makefile 我不太會用,也沒有時間去找文章。<br /><br /><br />這裡我下載了兩個檔案:<br /><a href="http://www.sqlite.org/download.html">SQLite</a> -> <a href="http://www.sqlite.org/sqlite-source-3_7_2.zip">sqlite-source-3_7_2.zip</a><br /><a href="http://www.codeproject.com/KB/database/CppSQLite.aspx">CppSQLite</a> -> <a href="http://www.codeproject.com/KB/database/CppSQLite/CppSQLite_3_1_demo_and_src.zip">CppSQLite_3_1_demo_and_src.zip</a><br /><br /><br /><span style="font-weight: bold;">首先建立動態連結庫</span><ol><li>新增 "Managed Make C++ Project" 專案 -> 名稱 "cppsqlite"<br /><br /></li><li>在 Project Type 中選擇 <span style="color: rgb(255, 0, 0);">Shared Library</span><br /><br /></li><li>在專案下新增 src 資料夾<br /><br /></li><li>複製 sqlite-source-3_7_2.zip 中所有的 source code 至 src 除了 <span style="color: rgb(255, 0, 0);">shell.c</span> 與 <span style="color: rgb(255, 0, 0);">tclsqlite.c</span><br /><br /></li><li>再複製 CppSQLite_3_1_demo_and_src.zip 中的 <span style="color: rgb(255, 0, 0);">CppSQLite3.h</span> 與 <span style="color: rgb(255, 0, 0);">CppSQLite3.cpp</span><br /><br /></li><li>開啟:專案 -> 內容<br /><br /></li><li>增加 Defined symbols 變數 -> <span style="color: rgb(255, 0, 0);">SQLITE_CORE</span><br /><a href="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-Gx6E-I/AAAAAAAAHrk/NJOKCIUoyMk/s1600-h/cppsqlite3-1.png"><img src="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-Gx6E-I/AAAAAAAAHrk/NJOKCIUoyMk/s256/cppsqlite3-1.png" alt="" id="BLOGGER_PHOTO_ID_5512986453501154274" border="0" /></a><br /><br /></li><li>在 C++ 跟 C 的 Optimization 的參數中增加 <span style="color: rgb(255, 0, 0);">-fPIC</span> 最佳化參數<br /><a href="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-RQddXI/AAAAAAAAHro/Hqn5DptWRl4/s1600-h/cppsqlite3-2.png"><img src="http://lh5.ggpht.com/_b8lN_UbLoEc/TIIP-RQddXI/AAAAAAAAHro/Hqn5DptWRl4/s256/cppsqlite3-2.png" alt="" id="BLOGGER_PHOTO_ID_5512986456313656690" border="0" /></a><br /><br /></li><li>按下『確定』後就會開始編譯,檔案有點多要稍微等一下</li></ol><br /><br /><br /><span style="font-weight: bold;">再來建立主程式專案</span><ol><li>新增 "Managed Make C++ Project" 專案 -> 名稱 "sqlite-test"<br /><br /></li><li>在 Project Type 中選擇 <span style="color: rgb(255, 0, 0);">Executable</span><br /><br /></li><li>在專案下新增 src 資料夾<br /><br /></li><li>複製 CppSQLite_3_1_demo_and_src.zip 中的 <span style="color: rgb(255, 0, 0);">CppSQLite3Demo.cpp</span> 至 src<br /><br /></li><li>開啟:專案 -> 內容<br /><br /></li><li>新增 Include paths -> <span style="color: rgb(255, 0, 0);">"../../cppsqlite/src"</span><br />這個設定是在告知<span style="color: rgb(255, 0, 0);">編譯</span>時額外 Include 的進來 <span style="color: rgb(255, 0, 0);">Header(*.h)</span> 的路徑。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS_sPYCgOpEypPgrvgOX_OrmlGt_LQ_VBG2tpRgPAijQz5VgEqxdF3IzcgWZg-ASAKsfxRhYd-K95A4dckCUQQprPX4IjFm-a1FUqOt1jRblLwMxRT5HXKdM3ejPlFmBVNw9ZSKnieGYAM/s1600-h/cppsqlite3-3.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS_sPYCgOpEypPgrvgOX_OrmlGt_LQ_VBG2tpRgPAijQz5VgEqxdF3IzcgWZg-ASAKsfxRhYd-K95A4dckCUQQprPX4IjFm-a1FUqOt1jRblLwMxRT5HXKdM3ejPlFmBVNw9ZSKnieGYAM/s256/cppsqlite3-3.png" alt="" id="BLOGGER_PHOTO_ID_5512986460108193122" border="0" /></a><br /><br /></li><li>新增連結路徑:<br />Library search path -> <span style="color: rgb(255, 0, 0);">"../../cppsqlite/Debug"</span><br />Libraries -> <span style="color: rgb(255, 0, 0);">cppsqlite</span><br />這個設定是給 gcc 在做<span style="color: rgb(255, 0, 0);">連結</span>時需要的搜尋路徑,以及需要連結的<span style="color: rgb(255, 0, 0);">對象名稱</span>。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrneIIAaN6Mo-HpfGZp0Vyt0u7NZgyiS-KmHkZD86SU2iBq5A2aWbT03ANRF9tTcFeJWTmlhpLezs_cKHYiBhiISQL7uJyvtDGW_CR97RqZX1m5LIEdA9kN4aAK_nuBPizGVbcBE0vMe6j/s1600-h/cppsqlite3-4.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrneIIAaN6Mo-HpfGZp0Vyt0u7NZgyiS-KmHkZD86SU2iBq5A2aWbT03ANRF9tTcFeJWTmlhpLezs_cKHYiBhiISQL7uJyvtDGW_CR97RqZX1m5LIEdA9kN4aAK_nuBPizGVbcBE0vMe6j/s256/cppsqlite3-4.png" alt="" id="BLOGGER_PHOTO_ID_5512986459036050930" border="0" /></a><br /><br /></li><li>按下『確定』後就會開始編譯<br /><br /></li><li>接著要將 cppsqlite.dll 複製到 sqlite-test/Debug 下<br /><span style="color: rgb(204, 0, 0);">Windows 的 lib 名稱為 "cppsqlite<span style="color: rgb(0, 0, 153);">.dll</span>"</span><br /><span style="color: rgb(204, 0, 0);">Linux 的 lib 名稱為 "<span style="color: rgb(0, 0, 153);">lib</span>cppsqlite<span style="color: rgb(0, 0, 153);">.so</span>"</span><br /><br /></li><li>然後就可以執行 sqlite-test.exe 了 <span style="color: rgb(102, 102, 102);font-size:85%;" >(一整個就很快樂)</span></li></ol><span style="font-weight: bold;">專案範例:</span><a style="font-weight: bold;" href="https://sites.google.com/site/weskerjax/code-demo/sqlite-test.zip?attredirects=0&d=1">sqlite-test.zip</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-70543936894784967322009-04-28T17:56:00.001+08:002009-04-28T17:58:07.614+08:00[C語言] 高斯消去法-特約化矩陣(RREF)<pre class="c" name="code"><br />#include<stdio.h><br />#include<stdlib.h><br /><br />/*高斯消去法 - 特約化矩陣*/<br />double **matrix_rref(double **matrix, int m, int n){<br /> double zero=0.00000001;<br /> double temp;<br /><br /> int x=0,y=0,j,i;<br /> while(x<n && y<m){<br /> // 如果列首為零,則找尋可以互換的列<br /> while(x<n && matrix[y][x]<zero && matrix[y][x]>(-zero)){<br /> j=y+1;<br /> while(j<m && matrix[j][x]<zero && matrix[j][x]>(-zero)){j++;}<br /><br /> // 此行都為零,移至下一行<br /> if(j >= m){ x++; continue; }<br /><br /> // 找到列首不為零的列,兩列互換<br /> for(i=x; i<n; i++){<br /> temp=matrix[j][i];<br /> matrix[j][i]=matrix[y][i];<br /> matrix[y][i]=temp;<br /> }<br /> // 互換結束跳出迴圈<br /> break;<br /> }<br /> if(x>=n){ break; }<br /><br /> // 所有列值都除以列首,列首為(1)處理<br /> for(i=n-1; i>x; i--){<br /> matrix[y][i]/=matrix[y][x];<br /> }<br /> matrix[y][x]=1;<br /><br /> // 消去上下列<br /> for(j=0; j<m; j++){<br /> // 跳過選取的列<br /> if(j == y){ continue; }<br /><br /> // 選取的列消去其他列<br /> for(i=n-1; i>=x; i--){<br /> matrix[j][i]-=matrix[y][i]*matrix[j][x];<br /> }<br /> }<br /><br /> x++; y++;<br /> }<br /> return matrix;<br />}<br /><br /><br /><br />/*<br />input.txt<br />4 5<br />1 2 3 7 55<br />1 3 2 4 76<br />3 2 1 6 43<br />4 6 5 3 34<br />*/<br /><br />/*主程式*/<br />int main(){<br /> int m,n,i,j;<br /> FILE *in;<br /> // 開啟檔案<br /> in=fopen("input.txt","r");<br /><br /> // 讀取 m,n 值<br /> fscanf(in,"%d\n",&m);<br /> fscanf(in,"%d\n",&n);<br /><br /> // 利用 malloc 配置二維空間 。<br /> double **mar= (double**) malloc(m * sizeof(double*));<br /> for (i=0; i<m; i++){<br /> mar[i] = (double*) malloc(n * sizeof(double));<br /> }<br /><br /> // 讀取矩陣<br /> for(i=0;i<m;i++){<br /> for(j=0;j<n;j++){<br /> fscanf(in,"%lf",&mar[i][j]);<br /> }<br /> }<br /><br /> // 高斯消去法<br /> mar=matrix_rref(mar,m,n);<br /><br /> // 列印結果<br /> for(i=0;i<m;i++){<br /> for(j=0;j<n;j++){<br /> printf("%.2lf ",mar[i][j]);<br /> }<br /> printf("\n");<br /> }<br /><br /> _getch();<br /><br /> return 0;<br />}<br /><br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com6tag:blogger.com,1999:blog-5946530704742130970.post-81527929291500380862009-04-25T16:58:00.008+08:002009-04-25T17:20:19.901+08:00[LEX] 使用命令列參數開啟檔案<pre class="c" name="code"><br />/*[flex] 的指令參數<br /> * ( flex -FLi8 %f )<br /> * -l 最大兼容性法則<br /> * -i 不區分大小寫<br /> * -f 產生不壓縮的完整表格,效率快,所需空間大<br /> * -F 最佳效率與空間優化<br /> * -L 在產生的程式碼中不加入 #line<br /> * -7 使用 7 bit 掃瞄文字(預設)<br /> * -8 使用 8 bit 掃瞄文字<br /> *<br /> * -+ 產生 C++ 掃瞄 Class<br /> *<br /> * -oOutputName 指定輸出檔案名稱<br /> *<br /> * -h 參數說明<br /> * -V 版本顯示<br /> * -T 顯示追蹤記錄<br /> * */<br /><br /><br /> /* [定義段落] */<br />%{<br />#include <stdio.h><br /><br />%}<br /><br /> /* 告知沒有自訂的 unput() */<br />%option nounput<br /><br /> /* 初始狀態 */<br />%s START<br /> /* 多行註解狀態 */<br />%s COMMENTS<br /><br /> /* 換行符號 */<br />EN [\r\n]<br /> /* 換行符號及空白字元 */<br />SP [ \t\r\n] //<br /> /* 單引號字串 */<br />//STR1 (\'([^\'\r\n]|"\\\'")*\')<br /> /* 雙引號字串 */<br />//STR2 (\"([^\"\r\n]|"\\\"")*\")<br /><br /><br />%% /* [規則段落] */<br /> <br /> /* 多行註解模式 */<br /><COMMENTS>"*/"{SP}* { BEGIN START; }<br /><COMMENTS>.|{SP} ;<br /><br /> /* 初始模式 */<br /><START>"/*" { BEGIN COMMENTS; }<br /><START>"//".*{EN}+ ;<br /><START>. {fprintf(yyout,"%s",yytext);}<br /><br /><br />%% /* [自訂函數段落] */<br /><br />/* 程式執行方式與檔案參數<br /> * 程式.exe 文件1.txt 文件2.txt 文件3.txt<br /> * 或使用文件拖放至程式上<br /> * */<br />char **fileList;<br />unsigned currentFile = 0;<br />unsigned nFiles;<br /><br />int main(int argc,char **argv){<br /> // 沒有檔案<br /> if(argc<2){<br /> printf("沒有給予檔案參數");return 0;<br /><br /> }else{<br /> // 取得檔案參數<br /> fileList = argv+1;<br /> nFiles = argc-1;<br /><br /> // 嘗試開啟第一個檔案<br /> yywrap();<br /> }<br /><br /> // 執行文字解析器<br /> yylex();<br /> /* 文字解析器會在檔案結束時<br /> * 自動呼叫 yywrap() 開啟下一個檔案<br /> * */<br /> <br /> return 0;<br />}<br /><br />/* 當沒自訂的 yywrap() 時<br /> * 記得在前加上 "%option noyywrap"<br /> * */<br />int yywrap(){<br /> // 關閉上次開啟的檔案<br /> if ((currentFile > 0) && (nFiles >= 1) && (currentFile <= nFiles)) {<br /> // 關閉輸入與輸出的文件<br /> fclose(yyin); fclose(yyout);<br /><br /> // 將暫存檔覆蓋原始輸入文件<br /> remove(fileList[currentFile-1]);<br /> rename("temp",fileList[currentFile-1]);<br /> }<br /><br /> FILE *fileIn = NULL;<br /> while ((currentFile < nFiles)) {<br /> // 檢查副檔名<br /> if(strstr(fileList[currentFile],".txt")!= NULL){<br /> // 設定初始狀態<br /> BEGIN START;<br /> }else{<br /> // 跳過不符合的檔案<br /> continue;<br /> }<br /><br /><br /> // 嘗試開啟檔案<br /> fileIn = fopen(fileList[currentFile++], "r");<br /> if (fileIn != NULL) {<br /> // 指定輸入與輸出的文件指標<br /> yyin = fileIn;<br /> yyout = fopen("temp","w");<br /><br /> // 成功開啟檔案跳出迴圈<br /> break;<br /> }<br /> printf("無法開啟檔案: %s\n",fileList[currentFile-1]);<br /> }<br /> // 回傳狀態 ( 0:成功開啟 , 1:開啟失敗 )<br /> return (fileIn ? 0 : 1);<br />}<br /><br /></pre><br />相關連結:<a href="http://www.ibm.com/developerworks/cn/linux/sdk/lex/">Yacc 与 Lex 快速入门</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com3tag:blogger.com,1999:blog-5946530704742130970.post-77578060333806742042009-04-25T03:21:00.005+08:002009-04-25T03:40:27.328+08:00[C語言] 快速排序法(quick sort)<pre class="c" name="code"><br />#include<stdio.h><br /><br />/** quick_sort [快速排序法]<br /> * @param {array} array<br /> * @param {int} low<br /> * @param {int} high<br /> */<br />int quick_sort(int *array,int low,int high) {<br /> int pivot_point,pivot_item,i,j,temp;<br /> // 指標交界結束排序<br /> if(high<=low){return 1;}<br /><br /> // 紀錄樞紐值<br /> pivot_item = array[low];<br /> j=low;<br /> <br /> // 尋找比樞紐小的數<br /> for(i=low+1; i<=high; i++) {<br /> // 跳過等於或大於的數<br /> if(array[i]>=pivot_item){continue;}<br /><br /> j++;<br /> // 交換 array[i] , array[j]<br /> temp = array[i];<br /> array[i] = array[j];<br /> array[j] = temp;<br /> }<br /><br /> // 將樞紐位址移到中間<br /> pivot_point=j;<br /> // 交換 array[low] , array[pivot_point]<br /> temp = array[low];<br /> array[low] = array[pivot_point];<br /> array[pivot_point] = temp;<br /><br /> // 遞迴處理左側區段<br /> quick_sort(array,low,pivot_point-1);<br /> // 遞迴處理右側區段<br /> quick_sort(array,pivot_point+1,high);<br /><br /> return 1;<br />}<br /><br /><br />/*主程式*/<br />int main(){<br /> int a[]={12,42,54,3,5,32,61,24,31};<br /><br /> quick_sort(a,0,8);<br /><br /> int i;<br /> for(i=0; i<=8; i++) {<br /> printf("%d\n",a[i]);<br /> }<br /><br /> _getch();<br /> return 0;<br />}<br /><br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com3tag:blogger.com,1999:blog-5946530704742130970.post-12784346137097260772009-04-25T02:56:00.001+08:002009-04-25T02:57:30.696+08:00[C語言] 連結串列(link list)<pre class="c" name="code"><br />/* link list (連結串列) */<br />#include<stdio.h><br />#include<string.h><br />#include<stdlib.h><br /><br />/* 定義結構型態 */<br />typedef struct link_node{<br /> int data;<br /> struct link_node *link;<br />} LINK_NODE;<br /><br /><br /><br />/* 產生新節點 */<br />LINK_NODE *new_node(int data){<br /> LINK_NODE *node;<br /> node=(LINK_NODE *) malloc(sizeof(LINK_NODE));/*<stdlib.h>*/<br /> <br /> // 記憶體不足<br /> if(node == NULL){ return NULL;}<br /> <br /> node->data=data; <br /> node->link=NULL; <br /> return node;<br />}<br /><br /><br />/* 加入新的資料於最後 */<br />LINK_NODE *push_node(LINK_NODE *list, int data){<br /> /*產生新節點*/<br /> LINK_NODE *node=new_node(data); <br /><br /> // 加入第一個新節點<br /> if(list==NULL){ <br /> list=node;<br /> }else{<br /> LINK_NODE *p=list; <br /> // 取得最後一個節點<br /> while(p->link!=NULL){p=p->link;}<br /> p->link=node;<br /> } <br /> return list;<br />}<br /><br /><br />/* 排序插入新節點 */<br />LINK_NODE *sort_insert(LINK_NODE *list,int data){<br /> // 加入第一筆資料<br /> <br /> // 產生新節點<br /> LINK_NODE *node=new_node(data); <br /> if(list==NULL){ list=node; return list; } <br /><br /> // 尋找大於資料(data)的位址<br /> LINK_NODE *r=list,*q=list; <br /> while(r!=NULL && r->data<data){ q=r; r=r->link; }<br /><br /> if(r==list){ // 首節點<br /> node->link=list; list=node; <br /> }else{ // 加入新節點於中間<br /> node->link=q->link; <br /> q->link=node; <br /> } <br /> return list; <br />}<br /><br /><br />/* 計算串列長度 */<br />int get_length(LINK_NODE *list){<br /> LINK_NODE *p=list;<br /> int count=0; <br /> while(p!=NULL){ <br /> count++; <br /> p=p->link; <br /> }<br /> <br /> return count;<br />}<br /><br /><br />/* 搜尋資料(data)的節點位子 */<br />LINK_NODE *search_node(LINK_NODE *list, int data){<br /> LINK_NODE *p=list; <br /> while(p!=NULL && p->data!=data){ p=p->link; }<br /> return p ;<br />}<br /><br /><br />/* 印出所有串列的所有資料 */<br />int display(LINK_NODE *list){<br /> LINK_NODE *p=list;<br /> while(p!=NULL){ <br /> printf("%d\n",p->data);/*<stdio.h>*/<br /> p=p->link; <br /> }<br /> return 1;<br />}<br /><br /><br /><br /><br />/*主程式*/<br />int main(){<br /> LINK_NODE *list=NULL;<br /> <br /> list=sort_insert(list,4);<br /> list=sort_insert(list,2);<br /> list=sort_insert(list,7);<br /> list=sort_insert(list,9);<br /> list=sort_insert(list,14);<br /> display(list);<br /> <br /> printf("--------------------------\n");<br /> <br /> list=push_node(list,4);<br /> list=push_node(list,2);<br /> list=push_node(list,7);<br /> list=push_node(list,9);<br /> list=push_node(list,14);<br /> display(list);<br /> <br /> _getch(); <br /> return 0;<br />}<br /><br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-82550265329032489682009-04-25T01:47:00.002+08:002009-04-25T01:59:35.573+08:00[C語言] 字串取代(str_replace)<strong>strlen</strong> , <strong>strcpy</strong> , <strong>strstr</strong> , <strong>strcat</strong> , <strong>malloc</strong> <br /><pre class="c" name="code"><br />#include <stdio.h><br />#include <string.h><br />#include <stdlib.h><br /><br />/* str_replace [字串取代]<br /> * @param {char*} source 原始的文字<br /> * @param {char*} find 搜尋的文字 <br /> * @param {char*} rep 替換的文字<br /> * */<br />char *str_replace (char *source, char *find, char *rep){<br /> // 搜尋文字的長度<br /> int find_L=strlen(find);<br /> // 替換文字的長度<br /> int rep_L=strlen(rep);<br /> // 結果文字的長度<br /> int length=strlen(source)+1;<br /> // 定位偏移量<br /> int gap=0;<br /> <br /> // 建立結果文字,並複製文字<br /> char *result = (char*)malloc(sizeof(char) * length);<br /> strcpy(result, source); <br /> <br /> // 尚未被取代的字串<br /> char *former=source;<br /> // 搜尋文字出現的起始位址指標<br /> char *location= strstr(former, find);<br /> <br /> // 漸進搜尋欲替換的文字<br /> while(location!=NULL){<br /> // 增加定位偏移量<br /> gap+=(location - former);<br /> // 將結束符號定在搜尋到的位址上<br /> result[gap]='\0';<br /> <br /> // 計算新的長度<br /> length+=(rep_L-find_L);<br /> // 變更記憶體空間<br /> result = (char*)realloc(result, length * sizeof(char));<br /> // 替換的文字串接在結果後面<br /> strcat(result, rep);<br /> // 更新定位偏移量<br /> gap+=rep_L;<br /> <br /> // 更新尚未被取代的字串的位址<br /> former=location+find_L;<br /> // 將尚未被取代的文字串接在結果後面<br /> strcat(result, former);<br /> <br /> // 搜尋文字出現的起始位址指標<br /> location= strstr(former, find);<br /> } <br /> <br /> return result;<br /><br />}<br /><br /><br />int main(){<br /> char* str1 = "this is a string of characters";<br /> char* str2 = str_replace(str1, "is","FFF");<br /> <br /> printf( "str1: '%s'\n", str1 );<br /> printf( "str2: '%s'\n", str2 );<br /><br /> _getch(); <br /> return 0;<br />}<br /><br /></pre><br /><br />參考來源:<br /><a href="http://www.cppreference.com/wiki/c/string/start">Standard C String and Character [C++ Reference]</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-55731925231591984812009-04-24T22:15:00.005+08:002009-04-24T22:44:15.790+08:00[C語言] 取得目錄名稱路徑(dirname)<strong>dirname</strong><br /><pre class="c" name="code"><br />#include <libgen.h><br /><br />int main(){<br /> char W_path1[] = "E:\\test" ;<br /> char W_path2[] = "E:\\Program\\clear\\ape-06\\Debug" ;<br /> char W_path3[] = "E:\\Program\\clear\\.metadata\\.plugins\\org" ;<br /> <br /> dirname(W_path1);<br /> printf("%s\n",W_path1);<br /> // E:\<br /> <br /> dirname(W_path2);<br /> printf("%s\n",W_path2);<br /> // E:\Program\clear\ape-06<br /> <br /> dirname(W_path3);<br /> printf("%s\n",W_path3);<br /> // E:\Program\clear\.metadata\.plugins<br /> <br /> char L_path1[] = "/test" ;<br /> char L_path2[] = "/Program/clear/ape-06/Debug" ;<br /> char L_path3[] = "/Program/clear/.metadata/.plugins/org" ;<br /> <br /> dirname(L_path1);<br /> printf("%s\n",L_path1);<br /> // /<br /> <br /> dirname(L_path2);<br /> printf("%s\n",L_path2);<br /> // /Program/clear/ape-06<br /> <br /> dirname(L_path3);<br /> printf("%s\n",L_path3);<br /> // /Program/clear/.metadata/.plugins<br /><br /><br /> _getch(); <br /> return 0;<br />}<br /><br /></pre><br /><br />參考來源:<br /><a href="http://opengroup.org/onlinepubs/007908775/xsh/libgen.h.html"><libgen.h></a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-52655996766818099292009-04-24T21:44:00.006+08:002009-04-25T01:47:13.101+08:00[C語言] 遞迴掃瞄目錄下所有文件(dir_recursive)<strong>opendir</strong> , <strong>readdir</strong> , <strong>closedir</strong><br /><pre class="c" name="code"><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />#include <sys/types.h><br />#include <dirent.h><br /><br /><br />/* dir_recursive [遞迴掃瞄目錄下所有文件]<br /> * 掃瞄 path 下所有的文件,並輸出至 output 的文件中<br /> * output 必須為可寫入的文件<br /> * */<br />int dir_recursive(char *path, FILE *output){<br /> char glue='\\'; // Windows 的分隔符號<br /> //char glue='/'; // Linux 的分隔符號<br /> <br /> // 嘗試開啟目錄<br /> DIR * dp = opendir(path);<br /> <br /> if (!dp){ <br /> // 不是目錄,輸出至檔案 <br /> fprintf(output,"%s\n",path);<br /> return 1;<br /> }<br /> <br /> struct dirent *filename; <br /> while((filename=readdir(dp))){<br /> // 跳過當前及母目錄<br /> if(!strcmp(filename->d_name,"..") || !strcmp(filename->d_name,".")){<br /> continue;<br /> }<br /> <br /> // 計算新的路徑字串所需的長度<br /> int pathLength=strlen(path)+strlen(filename->d_name)+2;<br /> // 產生新的陣列空間<br /> char *pathStr = (char*)malloc(sizeof(char) * pathLength);<br /> // 複製當前目錄路徑至新的陣列空間<br /> strcpy(pathStr, path);<br /> <br /> // 檢查目錄分隔符號<br /> int i=strlen(pathStr);<br /> if(pathStr[i-1]!=glue){<br /> pathStr[i]=glue;<br /> pathStr[i+1]='\0';<br /> }<br /> <br /> // 串接次目錄名稱或檔案名稱至新的陣列空間<br /> strcat(pathStr, filename->d_name);<br /> <br /> // 遞迴呼叫目錄掃瞄<br /> dir_recursive(pathStr,output);<br /> <br /> }<br /> <br /> // 關閉目錄<br /> closedir(dp);<br /> <br /> return 1;<br />}<br /><br /><br /><br />int main(){<br /> // 建立輸出的文件檔<br /> FILE *fileOut = fopen("output.txt", "w");<br /> <br /> // 掃瞄 E:\test 下所有的文件<br /> dir_recursive("E:\\test",fileOut); <br /> <br /> return 0;<br />}<br /><br /></pre><br /><br />參考來源:<br /><a href="http://hi.baidu.com/phps/blog/item/92120fd1645fc9d2562c840a.html">[原创]LINUX下用C语言历遍目录 C语言列出目录_小徐博客 学无止境 minix and linux</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-68677453223379239182009-04-24T20:09:00.008+08:002009-04-25T01:47:37.785+08:00[C語言] 字串相加(string_concat)<strong>strlen</strong> , <strong>strcpy</strong> , <strong>strcat</strong><br /><pre class="c" name="code"><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />/* string_concat [字串相加]<br /> * 將 str1 與 str2 相加,並返回新的字串<br /> * */<br />char *string_concat(char *str1, char *str2) {<br /> // 計算所需的陣列長度<br /> int length=strlen(str1)+strlen(str2)+1;<br /> <br /> // 產生新的陣列空間<br /> char *result = (char*)malloc(sizeof(char) * length);<br /> <br /> // 複製第一個字串至新的陣列空間<br /> strcpy(result, str1);<br /> // 串接第二個字串至新的陣列空間<br /> strcat(result, str2);<br /> <br /> return result;<br />}<br /><br /><br />int main(){<br /> char *a="123456";<br /> char *b="abcde";<br /> char *c=string_concat(a,b);<br /> printf("%s\n",c);<br /> <br /> _getch();<br /> return 0;<br />}<br /><br /></pre><br /><br />參考來源:<br /><a href="http://www.cppreference.com/wiki/c/string/start">Standard C String and Character [C++ Reference]</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com1tag:blogger.com,1999:blog-5946530704742130970.post-71473920854050107812009-04-24T19:10:00.004+08:002013-06-11T21:47:13.968+08:00[C語言] 檔案讀寫<strong>fclose</strong> , <strong>feof</strong> , <strong>fopen</strong> , <strong>fprintf</strong> , <strong>fscanf</strong> , <strong>printf</strong> , <strong>remove</strong> , <strong>rename</strong> , <strong>rewind</strong> , <strong>scanf</strong> , <strong>ftell</strong> , <strong>fseek</strong><br />
<pre class="c" name="code">#include <stdio.h>
int main(){
FILE *fileIn;
FILE *fileOut;
fileIn = fopen("input.txt", "r");
if(fileIn == NULL){printf("檔案不存在\n"); return 0;}
fileOut = fopen("output.txt", "w");
/* Mod:
* "r" : 開啟檔案,以純文字方式[讀取]。
* "w" : 開啟或建立檔案,以純文字方式[寫入],會複寫原先的資料。
* "a" : 開啟或建立檔案,以純文字方式[寫入],並將檔案指標移到最後。
* "rb" : 同 "r" 但以二進位(binary)方式[讀取]。
* "wb" : 同 "w" 但以二進位(binary)方式[寫入]。
* "ab" : 同 "a" 但以二進位(binary)方式[寫入]。
* "r+" : 同 "r" 但同時具有[讀取/寫入]的權力
* "w+" : 同 "w" 但同時具有[讀取/寫入]的權力
* "a+" : 同 "a" 但同時具有[讀取/寫入]的權力
* "rb+" : 同 "rb" 但同時具有[讀取/寫入]的權力
* "wb+" : 同 "wb" 但同時具有[讀取/寫入]的權力
* "ab+" : 同 "ab" 但同時具有[讀取/寫入]的權力。
*/
int a1;
float a2;
char a3;
char a4[100];
while(!feof(fileIn)){// 當讀取結束時會回傳 true
// 依格式讀取一列文字,所有的變數都要取址,除了字元陣列
fscanf(fileIn,"%d %f %c %s",&a1,&a2,&a3,a4);
// 依格式將資料輸出至螢幕上
printf("%d %f %c %s\n",a1,a2,a3,a4);
// 依格式寫入一列文字
fprintf(fileOut,"%d %f %c %s\n",a1,a2,a3,a4);
/* %c : 一個字元(char)格式
* %s : 一個字串格式
*
* %i : 一個整數(int)格式
* %d : 一個十進位整數(int)格式
* %u : 一個十進位無符號整數(unsigned)格式
*
* %e, %f, %g : 一個浮點數(float)格式
* %lf: 一個浮點數(double)格式
*
* %o : 八進位(02732)格式
* %x : 十六進位(0x27fa)格式
* %% : 跳脫成 %
* */
}
// 輸出當前的檔案指標位址
printf("offset = %ld\n", ftell(fileIn) );
// 將檔案指標返回至最上面,失敗則回傳 0
// 會清除錯誤並將 EOF 標示清除
// 當需要重新讀取時可利用此函數
rewind(fileIn);
// 將移動檔案指標從開始處偏移 5 個字元,成功則回傳 0
// 會將 EOF 標示清除
fseek(fileIn,5,SEEK_SET);
/* int fseek( FILE *stream, long offset, int origin );
* stream : 檔案指標
* offset : 偏移量,可為正負數
* origin : 偏移的依據位址
* SEEK_SET 0 檔案起始位址
* SEEK_CUR 1 當前位址
* SEEK_END 2 檔案結束位址
* */
// 關閉檔案指標
fclose(fileIn);
fclose(fileOut);
// 將檔案 "input.txt" 移除
remove("input.txt");
// 將 "output.txt" 的檔案名稱變更為 "input.txt"
rename("output.txt","input.txt");
// 按任意鍵結束
_getch();
return 0;
}
</pre><br />
<br />
參考來源:<br />
<a target="_blank" href="http://www.cppreference.com/wiki/c/io/start">Standard C I/O [C++ Reference]</a><br />
<a target="_blank" href="http://caterpillar.onlyfun.net/Gossip/CGossip/PrintfScanf.html">printf() 與 scanf()</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-50103880415522058362009-04-24T16:11:00.010+08:002009-04-25T01:47:23.016+08:00[C語言] 動態記憶體配置(malloc)<strong>malloc</strong> , <strong>calloc</strong> , <strong>realloc</strong> , <strong>free</strong><br /><pre class="c" name="code"><br />#include <stdlib.h><br /><br />int main(){<br /><br />/*一維陣列*/<br /> int size1=1000;<br /> int *array1;<br /> <br /> // 利用 malloc 配置空間 。<br /> array1 = (int*) malloc(size1 * sizeof(int));<br /> <br /> // 利用 calloc 配置空間,會初始為 0 。<br /> array1 = (int*) calloc(size1 , sizeof(int));<br /> <br /> // 利用 realloc 將原本的空間調整成兩倍,並且複製原本的內容,<br /> // 但不保證是原本的空間位址。 <br /> array1 = (int*) realloc(array1, 2 * size1 * sizeof(int));<br /> <br /> <br /> // 釋放記憶體空間。<br /> free(array1);<br /> <br /> <br />/*二維陣列*/<br /> int i;<br /> int size_x=100;<br /> int size_y=100;<br /> int **array2;<br /> <br /> // 利用 malloc 配置二維空間 。<br /> array2 = (int**) malloc(size_x * sizeof(int*));<br /> for (i=0; i<size_x; i++){<br /> array2[i] = (int*) malloc(size_y * sizeof(int));<br /> }<br /> <br /> <br /> // 釋放記憶體空間<br /> for (i=0; i<size_x; i++){<br /> free(array2[i]);<br /> }<br /> free(array2);<br /> <br /> return 0; <br />}<br /></pre><br /><br />參考來源:<br /><a href="http://www.cppreference.com/wiki/c/mem/start">Standard C Memory [C++ Reference]</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0