Chinaunix首页 | 论坛 | 博客
  • 博客访问: 929034
  • 博文数量: 177
  • 博客积分: 8613
  • 博客等级: 中将
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-12 04:16
文章分类
文章存档

2012年(12)

2011年(24)

2010年(24)

2009年(75)

2008年(42)

我的朋友

分类: C/C++

2009-07-23 22:55:05

    今天写了四个关于字符串的小c,这周主要是在学字符串的这几个库函数了,列举一下,总结一下,熟悉一下:

1、
[root@bjxdurs235 20090723]# cat my_strcpy_end.c
#include

char *my_strcpy_end( char *dst, char *src )
{
        while ( *src != '\0' )
        {
                *dst++ = *src++;
        }
        return dst;
}

int main(void)
{
        char a[10] = "hello";
        printf("%d\n", my_strcpy_end( a,"are" ) - a );

}
库里的strcpy返回的是指向第一个字符的指针,习题要求返回一个指向最后一个字符的指针,这个程序我用gdb调试过了,返回dst是没有问题的,答案里返回dst - 1,肯定是错误的,这个小程序没有什么新鲜的知识,纯粹的赋值而已。

2、
[root@bjxdurs235 20090723]# cat my_strlen.c
#include
#include
#include

size_t my_strlen( char *str, size_t max_length )
{
        size_t length = 0;
        while ( *str != '\0' )
        {
                length++;
                if ( length == max_length )
                {
                        *str = '\0';
                        return (max_length - 1);
                }
                str++;
        }
        return length;

}

int main(void)
{
        char a[10] = "hello";
        strncpy(a,"can u help me ?",5);
        printf("a : %s\n",a);
        printf("length of a : %d\n",my_strlen(a,10));
}
这个习题的目的是控制strlen在处理非0结尾的中间字符串的时候有问题,核心思想是把目标数组的长度传过去,答案里的实现是从第一个到第max_length个元素和\0进行比较,相等则返回那也是个好方法我这个是用length和长度比,多浪费了一个变量的内存。

3、
[root@bjxdurs235 20090723]# cat my_strrchr.c
#include
#include

char *my_strrchr( char const *str, int ch )
{
        char *last;
        char *local;
        last = strchr(str,ch);
        while ( 1 )
        {
                local = strchr(last+1,ch);
                if ( local == NULL )
                        return last;
                last = local;
        }

}

int main(void)
{
        char a[100] = "hello world oh my god !";
        char *adr = my_strrchr(a,'o');
        printf("address: %s\n",adr);
}
   这个和书上的strrstr的实现有点类似,核心思想是先定位第一个字符出现的位置,然后设置一个last和local指针分别指向上一次的位置和本次的位置,直到本次找不到了,返回上一次找到的位置,这个思想很有用,将来的链表也会使用。
    我写的这个还是不如答案里的实现简单明了。。。

4、
[root@bjxdurs235 20090723]# cat strtok.c
#include
#include


int main(void)
{
        int ch;
        int i = 0;
        int num = 0;
        char a[100];
        char const *whilespace  = " \n\r\t\v\f";
        while ( ( ch = getchar() ) != EOF ){
                a[i++] = ch;
        }

        char *token = strtok(a,whilespace);
        while ( token != NULL ){
                printf("%s\n",token);
                if ( strcmp(token,"the") == 0 ) num++;
                token = strtok(NULL,whilespace);
        }

        printf("num of string\"the\" : %d\n",num);

}
   这个strtok应该是今天最大的收获了,strcpy、strcat、strstr等这些库函数都好用而且简单易懂,唯独这个强大的strtok不太好明白,goolge了一下,才明白他的道理:

char *token = strtok(a,whilespace); (第一次扫描,用NULL将数组a里的空白代替)
        while ( token != NULL ){ (判断到最后)
                printf("%s\n",token);
                if ( strcmp(token,"the") == 0 ) num++; (如果单词是the,就增加计数器)
                token = strtok(NULL,whilespace);(这一步千万注意啊,我刚开始调试的时候就是这里忽略了,光改上面的分隔符,导致第二次以后的分隔都没有计数,晕啊)
        }


总结一下:
   在了解了指针、函数、数组、字符等概念后,在来写字符串相关的函数、看这方面的函数语句,看来是都问题不太大了,像今天的strtok,估计过一个月又忘记了,但是到时候返回来看看,就清楚了,多在实际中遇到它,才会越来越熟悉。
阅读(855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~