C和指针 第6章 指针 6.12 实例

本文详细解析了C语言中计算字符串长度的strlen函数及其内部逻辑,包括对NULL指针的处理。此外,还介绍了两个在字符串数组中查找特定字符的函数,讨论了它们的实现方式和潜在副作用。这两个函数分别处理字符串查找的不同场景,强调了指针操作的注意事项和代码优化的考虑。
摘要由CSDN通过智能技术生成

6.12 实例
    用来计算一个字符串的长度。
    /*
    **计算一个字符串的长度
    */
    #include<stdlib.h>
    
    size_t strlen(char *string)
    {
        int length = 0;
        
        /*
        **依次访问字符串的内容,计算字符数,直到遇见NUL终止符。
        */
        while(*string++ != '\0')
        {
            length += 1;
        }
        
        return length;    
    } 
    程序6.1 字符串长度 strlen.c
    警告:
    如果这个函数传递给它的是一个NULL指针,那么while语句中的间接访问将会失败。函数是不是应该在解引用指针前检测这个条件呢?从绝对安全的角度将,应该如此。但是,这个函数并不负责创建字符串。如果它发现参数为NULL,它肯定发现了一个出现在程序其他地方的错误。当指针创建时检查它是否有效是合乎逻辑的,因为这样只需检查一次。这个函数采用的就是这种方式。如果函数失败是因为粗心大意的调用者懒得检查参数的有效性而引起的,那是它活该如此。
    函数的参数是strings和value,strings是一个指向指针数组的指针,value是我们所查找的字符串。注意,指针数组以一个NULL指针结束。函数将检查这个值以判断循环何时结束。下面这行表达式:
    while( (string = *strings++) != NULL ){
    完成三项任务:把strings当前所指向的指针复制到变量string中;增加strings的值,使它指向下一个值;测试string是否为NULL。当string指向当前字符串中作为终止标志的NUL字节时,内层的while循环就终止。
    /*
    **给定一个指向以NULL结尾的指针列表的指针,在列表中的字符串中查找一个特定的字符。
    */
    #include<stdio.h>
    #define TRUE 1
    #define FALSE 0
    
    int find_char( char **strings, char value )
    {
        char *string;  /*我们当前正在查找的字符串*/
        
        /*
        **对于列表中的每个字符串...
        */
        while( (string = *strings++ ) != NULL )
        {
            /*
            **观察字符串中的每个字符,看看它是不是我们需要查找的那个
            */
            while( *string != '\0' )
            {
                if( *string++ == value ){
                    return TRUE;
                }    
            }    
        }
        return FALSE;
    } 
    程序6.2 在一组字符串中查找:版本1        s_srch1.c
    如果string尚未到达其结尾的NUL字节,就执行下面这条语句:
    if( *string++ == value )
    它测试当前的字符是否与需要查找的字符匹配,然后增加指针的值,使它指向下一个字符。
    程序6.3实现相同的功能,但它不需要对指向每个字符串的指针进行复制。但是,由于存在副作用,这个程序将破坏这个指针数组。这个副作用使该函数不如前面那个版本有用,因为它只适用于字符串只需要查找一次的情况。
    /*
    **给定一个指向以NULL结尾的指针列表的指针,在列表中的字符串中查找一个特定的字符。这个函数将破坏这些指针,所以它只适用于这组字符串只使用一次的情况。
    */
    #include<stdio.h>
    #define TRUE 1
    #define FALSE 0
    int find_char( char **strings, char value )
    {
        assert( strings != NULL ); 
        /*
        **对于列表中的每个字符串...
        */
        while( *strings != NULL )
        {
            /*
            **观察字符串中的每个字符,看看它是不是我们需要查找的那个。
            */
            while( *(*strings) != '\0' )
            {
                if( *(*strings)++ == value ){
                    return TRUE;
                }    
            }
            strings++;    
        }        
        return FALSE;
    } 
    程序6.3 在一组字符串中查找:版本2                s_srch2.c
    第1个是**strings。第1个间接访问操作访问指针数组中的当前指针,第2个间接访问操作随该指针访问字符串中的当前字符。内层的while语句测试这个字符的值并观察是否达到了字符串的末尾。
    第2个有趣的表达式是*(*strings)++。这里需要括号,这样才能是表达式以正确的顺序进行求值。第1个间接访问操作访问列表中的当前指针。增值操作把该指针所指向的那个位置的值加1,但第2个间接访问操作作用于原先那个值的副本。这个表达式的直接作用是对当前字符串中的当前字符进行测试,看看是否达到了字符串的末尾。它的副作用是指向当前字符串字符的指针值将增加1。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值