在C語言實現substr()

select * from wp_mban_banner where id = 13Select returned 1 rows. 0: select * from wp_mban_banner where id = 1Select returned 1 rows. 0:

ㄚ琪發現常用PHP寫web程式很容易變笨,這會想用C寫支程式轉檔後存MySQL資料庫,卻發現連substr的功能都沒有,Orz~後來ㄚ琪看到(原創) 如何在C語言實現substr()? (C/C++) (C)才發現可以自己動手寫substr的函數,給他棒棒一下。

Abstract
若要說處理字串什麼函數最常用,()應該會是前幾名,以我的經驗,C++、C#、VB、VFP、T-SQL都提供了substr(),好像C語言就沒提供這個函數,真的是這樣嗎?

就連ㄚ琪常用的PHP、perl、Python跟ASP也都有啊。

Introduction


/*
(C) OOMusou 2008 http://oomusou.cnblogs.com
Filename : c_substr.c
Compiler : Visual C++ 8.0
Description : Demo how to use () in C
Release : 03/08/2008 1.0
*/
#include <stdio.h>
#include <string.h>

int main() {
char s[] = “Hello World”;
char t[6];
strncpy(t, s + 6, 5);
t[5] = 0;
printf(“%s\n”, t);
}

執行結果

World

strncpy函數原型如下

char *strncpy(char *dest, const char *src, size_t n);

dest為目標字串,src為來源字串,n為複製的字數。所以我們可以去變動src的指標,這樣就可以用strncpy()來模擬substr()了,我想這也是為什麼C語言不提供substr()的原因,畢竟用strncpy()就可以簡單的模擬出來。

唯一比較討厭的是

t[5] = 0;

因為strncpy()不保證傳回的一定是NULL terminated,所以要自己補0當結尾,這是C語言比較醜的地方,若覺得strncpy()用法很醜陋,可以自己包成substr()。

C語言

1 /*
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename    : c_substr.c
5 Compiler    : Visual C++ 8.0
6 Description : Demo how to use strncpy() in C
7 Release     : 03/08/2008 1.0
8 */
9 #include <stdio.h>
10 #include <string.h>
11
12 void substr(char *dest, const char* src, unsigned int start, unsigned int cnt) {
13   strncpy(dest, src + start, cnt);
14   dest[cnt] = 0;
15 }
16
17 int main() {
18   char s[] = “Hello World!!”;
19   char t[6];
20   substr(t, s, 6, 5);
21   printf(“%s\n”, t);
22 }

執行結果

World

這樣就漂亮多了,程式碼我就不再多做解釋了。

Conclusion
原本以為C語言沒有提供substr(),卻意外發現竟然有個很類似的strncpy(),所以真的不能小看C語言,在訂定標準時,其實都有考慮到了。

Print Friendly, PDF & Email

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料