乙個函式,可以提取sql語句中查詢字段部分。雖然函式中使用了block,但是block可以很方便的轉換成純 c 的函式,而且未來 block 也很有可能成為 c 標準。
#import typedef struct field field;
const field emptyfield = ;
static inline bool samefield(field field1, field field2)
return no;
};void sqlparser(const char *sqlcstring)
switch (sqlcstring[i])
break;
case '`':
split_string_duplicate('`', j);
j = strlen(tmpcstring);
if (sqlcstring[i] == ')')
break;
case ')':
meetend = yes;
break;
default:
break;}}
break;
case '\'':
// 單引號,要遮蔽兩個連續的單引號
while (i < sqlcstringlength) else
}else}}
break;
case '`':
// 反單引號 取所有內容
while (i < sqlcstringlength) else}}
break;
default:
// 其它字元,遇到空格或逗號結束, 遇到左小括號就直到右小括號結束
while (i < sqlcstringlength)
if (sqlcstring[i] == ' ' || sqlcstring[i] == ',')
}break;}};
// 複製上面這個block,使其可在其內部呼叫
split_string_duplicate = split_string;
field fields[100] = ;
__block field *fields_pointer = fields; // 存放所有欄位的陣列
__block char *tmp_field_name = null; // 存放乙個欄位名
__block bool meetas = no; // 遇到 as 關鍵字
void (^field_parser)(char *) = ^(char *field_word) else
free(tmp_field_name);
tmp_field_name = null;
fields_pointer ++;
}}else if(strcmp(field_word, "as") == 0)
meetas = yes;
}elseelse}};
bool meetfield = no;
while (i < sqlcstringlength)
}goto loop_start;
break;
default:
split_string(sqlcstring[i], 0);
break;
}if (meetfield == yes)
field_parser(tmpcstring);
}}else if (strcmp(tmpcstring, "select") == 0)
tmpcstring[0] = '\0';
}// 釋放記憶體
if (tmp_field_name != null)
free(tmpcstring);
tmpcstring = null;
int fi = 0;
while (!samefield(fields[fi], emptyfield))
}
用C 實現基於用C 實現基於TCP協議的網路通訊
tcp 協議是乙個基本的網路 協議,基本上所有的網路服務都是基於 tcp協議的,如http,ftp等等,所以要了解網路程式設計就必須了解基於 tcp協議的程式設計。然而 tcp協議是乙個龐雜的體系,要徹底的弄清楚它的實現不是一天兩天的功夫,所幸的是在.net framework環境下,我們不必要去追...
LZW基於C語言的實現
lzw演算法具有很多版本,其大致思想一致。主要思想是盡最大可能不產生冗餘,以自適應的方式建立乙個內部字典。其演算法流程如下 lzw演算法流程 步驟1 開始時的詞典包含所有可能的根 root 而當前字首p是空的 步驟2 當前字元 c 字元流中的下乙個字元 步驟3 判斷綴 符串p c是否在詞典中 1 如...
基於c 的ostu演算法的實現
影象二值化演算法是影象處理的基礎。一般來說,二值化演算法可以分為兩個類別 全域性二值化和區域性二值化。全域性二值化是指通過某種演算法找到乙個全域性的閾值t,對影象中座標為 x,y 的畫素值做如下處理 ostu就是這樣一種全域性二值化演算法,又叫最大類間方差。因為該演算法會遍歷影象中任意乙個畫素值i,...