在C語言實現substr()

substr

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

Abstract

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

哥的C# string substring的文章可以參考→C# Substring 定義及七種用法

※2020/12/11 這真的詭異了,Google 『c substring』 還是會找到上面的文章,原本的這篇在C語言實現substr()找不到了。

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

Introduction

C語言

/*  
(C) OOMusou 2008 http://oomusou.cnblogs.com

Filename    : c_substr.c
Compiler    : Visual C++ 8.0
Description : Demo how to use strncpy() 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( " %sn " , 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語言

/*  
(C) OOMusou 2008 http://oomusou.cnblogs.com

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

 void substr( char   * dest, const   char * src, unsigned int start, unsigned int cnt) {
   strncpy(dest, src + start, cnt);
   dest[cnt] =   0 ;
 }

 int main() {
   char s[] =   " Hello World!! " ;
   char t[ 6 ];
   substr(t, s, 6 , 5 );
   printf( " %sn " , t);
 }

執行結果

World

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

Conclusion

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

※2022/02/24
今天在D 棧-DelftStack看到了《如何在 C 語言中獲取子字串》這篇文章,裡頭有 memcpy()這個函式也可以做substring,底下節錄作法給各位學習:

memcpy() 函式將原始檔中的字元數複製到目標檔案的記憶體區。這個函式在 <string.h> 標頭檔案中可用。

當來源位址和目標位址重疊時,這個函式會產生問題。這個函式不檢查位址是否為空,也不檢查是否發生溢位。

memcpy() 函式返回一個指向目標字串的指標。沒有返回值來顯示錯誤。

memcpy() 的語法

void *memcpy(void *destination_string, const void *source_string, size_t number);
  • destination_string 是指向目標字串的指標。
  • source_string 是指向原始字元型別值陣列的指標。
  • number 是字元數。
#include <stdio.h>
#include <string.h> 

int main(void)
{
    char *text = "The test string is here";
  	char subtext[7];
  	
    memcpy(subtext,&text[9],6);
    subtext[6] = '0';
    printf("The original string is: %sn",text);
    printf("Substring is: %s",subtext);
 
    return 0;
}

輸出:

The original string is: The test string is here
Substring is: string

如果你苦惱的是編譯器的使用,可以看看設定C和C++ Code::Blocks編譯器的初學者教學指南
或者完全看不懂大叔在寫什麼,那麼推薦你去好學校上C 語言入門特訓,祝福你

有關c++ substr的使用可以參考C++全方位學習第四版(適用Dev C++與Visual C++),本書第一版榮獲國家圖書館狀元推薦閱讀書單科學類第15名,也是唯二進榜的程式設計書籍,也可以參考我們從微軟文件節錄出來的c++ substr及c++常用七種字串函數

順便看看 資料庫正規化MySQL 流程控制的迴圈

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。