今天写了四个关于字符串的小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) |