C语言字符串长度统计函数strlen()的实现原理
C标准库中有一个字符串长度统计函数strlen(),用来统计字符串的长度,它的实现与下面类似。
- #include <stdlib.h>
- size_t strlen( char *string )
- {
- int length = 0;
- // 依次访问字符串的内容,计算字符数,直至遇到NUL终止符
- while( *string++ != '\0' )
- length += 1;
- return length;
- }
#include <stdlib.h> size_t strlen( char *string ) {int length = 0;// 依次访问字符串的内容,计算字符数,直至遇到NUL终止符while( *string++ != '\0' )length += 1;return length; }
两点注意:
- size_t 为stddef.h中定义的数据类型,等价于 unsigned int,它的取值必须大于等于0。
- while()循环条件中,*string++等价于*(string++)。string是指针变量,保存的是字符串的起始地址(第一个字符的地址),地址是一个整数,可以进行算术运算,加 1 后为下一个字符的地址。
在指针到达字符串末尾的NUL字节之前,while语句中*string++表达式的值一直为真。它同时增加指针的值,用于下一次测试。这个表达式甚至可以正确地处理空字符串。
如果这个函数调用时传递给它的是一个NULL指针,那么while语句中的间接访问将会失败。函数是不是应该在解引用指针前检查这个条件?从绝对安全的角度讲,应该如此。但是,这个函数并不负责创建字符串。如果它发现参数为NULL,它肯定发现了一个出现在程序其他地方的错误。 当指针创建时检查它是否有效是合乎逻辑的,因为这样只需检查一次。这个函数采用的就是这种方 法。如果函数失败是因为粗心大意的调用者懒得检查参数的有效性而引起的,那是他活该如此。
C语言统计输入的单词的个数
编写一个程序,对标准输入进行扫描,并对单词“the”出现的次数进行计数。进行比较时应该区分大小写,所以“The”和“THE”并不计算在内。你可以认为各单词由一个或多个空格字符分隔,而且输入行在长度上不会超过100个字符。 计数结果应该写到标准输出上。
声明—个长度为101个字节的缓冲区数组,用于保存100个字节的输入和NUL终止符。strtok 函数用于逐个提取单词。
声明—个长度为101个字节的缓冲区数组,用于保存100个字节的输入和NUL终止符。strtok 函数用于逐个提取单词。
- // 计算标准输入中单词“the”出现的次数。字母是区分大小写的,输入中的单词由一个或多次空白字符分隔。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- char const whitespace[] = " \n\r\f\t\v";
- int main ()
- {
- char buffer[101];
- int count;
- char *word;
- count = 0;
- // 读入文本行,直到发现EOF
- while( gets(buffer) ) {
- // 从缓冲区逐个提取单词,直到缓冲区内不再有单词。
- for( word = strtok ( buffer, whitespace );
- word != NULL;
- word = strtok( NULL, whitespace )
- ){
- if( strcmp( word, "the" ) == 0 )
- count += 1;
- }
- }
- printf("%d\n", count);
- return EXIT_SUCCESS;
- }