字符串
用C字符串指针在很大程度上相互交织。你必须熟悉指针概念在先前的文章中使用有效的C字符串。一旦你习惯了,不过,你可以经常执行字符串操作非常有效。18新利最新登入
C是简单的字符数组中的字符串。以下行声明了一个数组,可以容纳多达99个字符的字符串。
广告
char str [100];
它拥有人物如你所愿:str [0]是第一个字符的字符串,str [1]是第二个字符,等等。但是为什么一个100 -元素数组无法容纳100个字符?因为C使用以null结尾的字符串,这意味着任何字符串结束的标志是ASCII值0(零字符),这也代表了在C' \ 0。
零终止非常不同于许多其他语言处理字符串的方法。例如,在帕斯卡,每个字符串包含一个字符数组,用一个长度字节使计数的数量的字符存储在数组中。这种结构使帕斯卡当你要求一个明确的优势一个字符串的长度。帕斯卡可以简单地返回长度字节,而C计算字符,直到找到' \ 0。这一事实使得C比帕斯卡在某些情况下慢得多,但在其他它更快,我们会看到下面的例子。
因为C提供了语言本身没有明确支持字符串,字符串处理函数都是在库中实现的。字符串I / 0操作(获得,等等)是在< stdio中实现。h >,和一组相当简单的字符串操作函数中实现<字符串。h >(在一些系统中,<字符串。h >)。
字符串不本机C迫使你创建一些相当迂回的代码。例如,假设您想将一个字符串分配给另一个字符串;也就是说,你想将一个字符串的内容复制到另一个。在C语言中,正如我们在上一篇文章中看到的,你不能简单地分配一个数组到另一个。你必须把它复制元素的元素。字符串库(<字符串。h >或<字符串。h >)包含一个函数调用拷贝字符串对于这个任务。这是一个非常常见的代码在一个正常的C程序:
char [100];strcpy(年代,“你好”);
这两条线执行后,下图显示的内容:18新利最新登入
上面的图显示了与字符数组。18新利最新登入底部图显示了等效ASCII代码值字符,实18新利最新登入际上就是C考虑字符串(包含整数值作为字节数组)。看到18新利最新登入比特和字节是如何工作的讨论的ASCII码。
下面的代码展示了如何使用18新利最新登入拷贝字符串在C:
# include <字符串。h > int main () {char s1 [100], s2 [100];strcpy (s1,“你好”);/ * * /拷贝字符串“hello”复制到s1 (s1, s2);/ *复制s1到s2 * /返回0;}
拷贝字符串每当一个字符串初始化用于c .你使用吗比较字符串在字符串库函数比较两个字符串。它返回一个整数,表示比较的结果。零意味着两个字符串是相等的,意味着负面价值s1小于s2意味着,一个积极的价值s1大于s2。
# include < stdio。h > # include <字符串。h > int main () {char s1 [100], s2 [100];得到(s1);得到(s2);如果(strcmp (s1, s2) = = 0) printf("平等\ n ");else if (strcmp (s1, s2) < 0) printf (" s1不到s2 \ n ");其他printf (“s1大于s2 \ n”);返回0;}
其他常见的字符串库中的函数包括strlen,它返回一个字符串的长度,和strcat连接两个字符串。字符串库包含许多其他功能,您可以通过阅读手册页细读。
你开始构建字符串函数,帮助您了解其他程序员的代码(似乎每个人都有他或她自己的字符串函数用于特殊目的的程序),我们将看两个例子,strlen和拷贝字符串。下面是一个严格的类pascal的版本strlen:
int strlen (char []) {int x;x = 0;而(s [x] ! = ' \ 0 ') x = x + 1;返回(x);}
大多数C程序员避开这种方法因为它看起来效率低下。相反,他们通常使用基于指针的方法:
int strlen (char * s) {int x = 0;而(*年代! = ' \ 0 '){x + +;s + +;}返回(x);}
你可以把这段代码如下:
int strlen (char * s) {int x = 0;而(* + +)x + +;返回(x);}
我想一个真正的C专家可以使代码更短。
当我编译这三段代码MicroVAX gcc,使用没有优化,并运行每20000次120个字符的字符串,第一段代码产生以12.3秒的成绩,第二次12.3秒,第三个12.9秒。这是什么意思?对我来说,这意味着你应该编写代码以任何方式对您来说最容易理解。指针通常产生更快的代码,但是strlen以上代码表明,这并非总是18新利最新登入如此。
我们可以通过相同的进化拷贝字符串:
s1 strcpy (char [], char s2 []) {int x;为(x = 0;x < = strlen (s2);x + +) s1 [x] = s2 [x];}
这里需要注意的是< =是很重要的为然后循环,因为代码复制' \ 0。一定要复制' \ 0。主要错误发生后如果你离开,因为字符串没有结束,因此一个未知的长度。还请注意,这段代码非常低效,因为strlen每次通过调用为循环。为了解决这个问题,您可以使用下面的代码:
s1 strcpy (char [], char s2 []) {int x, len;len = strlen (s2);为(x = 0;x < =兰;x + +) s1 [x] = s2 [x];}
指针的版本是相似的。
strcpy (char * s1、s2 char *){虽然(* s2 ! = ' \ 0) {* s1 = * s2;s1 + +;s2 + +;}}
你可以进一步压缩这段代码:
strcpy (char * s1、s2 char *){虽然(* s2) * s1 + + = * s2 + +;}
如果你愿意,你甚至可以说而(* s1 + + = * s2 + +);。的第一个版本拷贝字符串需要415秒10000次复制120个字符的字符串,第二个版本需要14.5秒,第三个版本9.8秒,第四个10.3秒。正如你所看到的,指针提供显著的性能提高。
的原型拷贝字符串在字符串库函数表明,它的目的是返回一个指向字符串的指针:
char *拷贝字符串(char * s1, s2 char *)
大部分的字符串函数返回一个字符串指针结果,和拷贝字符串回报的价值s1作为其结果。
使用字符串的指针有时会导致明确的改善速度,你可以利用这些如果你想到他们。例如,假设您想要删除的领先的空白字符串。你可能倾向于转移字符的空格删除它们。在C语言中,你可以完全避免运动:
# include < stdio。h > # include <字符串。h > int main () {char [100], * p;(s);p = s;而(* p = = ' ') p + +;printf (" % s \ n, p);返回0;}
这是远远高于运动技术,尤其是对长字符串。
你会接很多技巧和字符串作为你沿着读其他代码。实践是开启宝库的钥匙。