目前分類:C programming (15)

瀏覽方式: 標題列表 簡短摘要

話說字串處理在C語言是很常用的,在使用時要注意的地方很多。一般在複製字串不外以下幾個function:

memcpy/strncpy/snprintf

各有其使用時機。strncpy看起來多一個n來指定複製長度,以避免overflow,乍看之下是很安全的,但結束符號常常是一個問題,導致結果和預期的不符。請見以下範例

#include <stdio.h>
#include <string.h>

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

c的macro真是博大精深,真要自己搞一些特異功能的macro腦子就不夠使了,但,至少要會抄!

C語言巨集定義技巧


kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

這次有兩個主題:

1. unix domain socket IPC

2. 傳structure

先看流程圖

domain_sock_flow 

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

事情發生在不同的processor對於 byte order會有相反的狀況,因此有了所謂的Big-endian和Little-endian。

對一個32-bit 整數0x12345678來說

1. Little-endian如intel的processor,在記憶體的順序為

    address               value

    0x00000001        0x78

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

const的位置決定修飾的對像,如 char const *p表示修飾的是*p,所以不能用*p='a',而p這個address是可以修改的,比如p=&q。

如果是char* const p,則表示修飾的是p這個address。所以可以用*p='a',而不能p=&q。這兩個是相反的例子。

再來是都不能修改的狀況,const char* const p,則*p跟p都不能再賦值了。

最後const是左修飾,所以 const char跟 char const是一樣的意思。

範例如下:

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

  • Oct 27 Wed 2010 10:38
  • scope

variable的modifier定義其特性,這次討論static與extern:

static variable: 其值是會保留在記憶體的,不隨著離開其scope而消失 (只initialize一次)。

extern variable: 該變數已在其他地方(包括其他file)被定義過了,存取的方式是先宣告為extern,再來存取。

看例子:

1. static variable:

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

已知

  1. int 4 bytes = 32 bits, char 1 byte = 8bits

  2. 負數以2's complement 儲存

  3. %d是signed integer %u是unsigned integer。做型別轉換時,需要做sign extention,方式為不足的bit補其符號(即正補0,負補1)。

環境

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

現有一段程式如下:

#include <iostream>
using namespace std;

kezeodsnx 發表在 痞客邦 PIXNET 留言(2) 人氣()

玩linux多多少少會看到一個用法 do xxx while(0)。從邏輯上來看,似乎沒什麼特別的,甚至會懷疑是否多此一舉 (while 0不就是直接跳出嗎?)。事實上,這是有一定用途的,主要是避免文法錯誤。在define macro時,只有一個語句,如#define foo(x) bar(x); 這樣多半不會有問題。但較複雜的macro搭配if else等flow control時,就會產生文法上的問題,看下例:

#define foo(x) bar(x); qoo(x);
int main(int argc, char* argv[])
{
        if(1)

kezeodsnx 發表在 痞客邦 PIXNET 留言(2) 人氣()

變數的宣告,會配置其所需的記憶體。每種變數所需的大小不一樣,比如說char是1 bytes,int 是4 bytes,double則是8 bytes。如果是這樣,那這些大小在記憶體中是如何擺放呢?是直覺的一個接一個放嗎?其實不然。這牽扯到performance / efficiency的問題! 在32 bits的架構上,一次的資料存取也就是32 bits (4 bytes)。而這4 bytes 不是隨便從哪個點抓都可以,而是以4 bytes為單位,不管需要的是其中那個byte,就抓那4個bytes。比如說,抓第0,4,8 ,12....等,而不會是從3,7,9開始抓4個bytes。

這代表什麼呢?這表示了對齊 (alignment)的重要,因為會影響到幾次才抓的完。如果要抓一個4 bytes 的int,而這個int是從6擺到10,那就表示要抓兩次,自然效能較差了。因此,在struct的宣告是存在對齊這件事的。見下例:

#include <stdio.h>

int main(int argc, char* argv[])

kezeodsnx 發表在 痞客邦 PIXNET 留言(3) 人氣()

網路抓來的範例程式再加點小修改,client連上server後,server送"Hi client!"給client。client收到後,再回傳"receiveack"給server表示收到。

server程式:


#include <sys/types.h>
#include <sys/socket.h>

kezeodsnx 發表在 痞客邦 PIXNET 留言(1) 人氣()

netdb相關程式

主要是在建立socket時,會需要一些參數,而這些參數會存在系統中,可藉由下列fucntion查詢系統的設定檔,然後餵給socket API。

介紹如下的function:

struct hostent *gethostbyname(const char *name);

struct servent *getservbyname(const char *name, const char *proto);

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

這系列是閱讀 The Linux socket TCP/IP protocols network programming tutorials所記錄的筆記,這份tutorial寫的相當好,如果有不清楚的地方,建議大家看看原文,寫的非常詳細,這裡只節錄重點。

 

Socket

1. socket是IPC所使用的一種API。

2. 也稱為Berkeley Socket或BSD Socket

3. Connection-oriented socket (TCP)

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

seek系列功能就像看片時,順轉或倒轉,在某種時機下還蠻重要的。

input.txt:

1111
2222
3333

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()

[轉載請註明出處] http://kezeodsnx.pixnet.net/blog

作者: kezeodsnx

Joke

會說3種語言以上的人,叫做 Multilingual(多種語言的)。
會說2種語言的人,叫做 Bilingual,(雙語的)。

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()