转载自: http://hi.baidu.com/heredo/blog/item/74c52313d28452876438dbb3.html
若要说处理字串什么函数最常用,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
3
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 10 #include 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
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 10 #include 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
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 10 #include 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语言,在订定标准时,其实都要考虑到了。