(原創) 如何在C語言實現substr()? (C/C++) (C)

來源:互聯網
上載者:User

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

Introduction
一個很簡單的需求,字串s為Hello World,希望從這個字串擷取World字串出來,若用C++,可以使用內建的substr(),但必須使用C++的std::string。

C++

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

4 Filename    : cpp_substr.cpp
5 Compiler    : Visual C++ 8.0
6 Description : Demo how to use substr() in C++
7 Release     : 03/08/2008 1.0
8 */
9 #include <iostream>
10 #include <string>
11 
12 using namespace std;
13 
14 int main() {
15   string s = "Hello World";
16   string t = s.substr(6, 5);
17  
18   cout << t << endl;
19 }

執行結果

World

C++部分都很明顯直觀,就不多做說明了。

C語言

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

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 int main() {
13   char s[] = "Hello World";
14   char t[6];
15   strncpy(t, s + 6, 5);
16   t[5] = 0;
17   printf("%s\n", t);
18 }

執行結果

World

strncpy函數原型如下

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

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

唯一比較討厭的是第16行

t[5] = 0;

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

C語言

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

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語言,在訂定標準時,其實都有考慮到了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.