取字符串长度的函数(不包括结尾0) strlen:
#include<stdio.h>
int mylen(const char *s)
{
int cnt = 0;
while(s[cnt] != 0){
cnt++;
}
return cnt;
}
int main()
{
char array[] = "dhahsvgasvj";
printf("len = %d", mylen(array));
return 0;
}
从s【0】开始遍历数组直到s【cnt】== '\0';输出cnt;
比较两个字符串的ASCII码值 strcmp:
#include<stdio.h>
int mycmp(const char*s1, const char*s2)
{
while(*s1 == *s2 && *s1 != 0){
s1++;
s2++;
}
return *s1 - *s2;
}
int main()
{
char array1[] = "abc";
char array2[] = "abc ";
printf("strcmp(array1,array2) = %d", mycmp(array1,array2));
return 0;
}
比较2个数组的每个字符,若相等,则继续往后遍历,知道不相等或遇到‘\0’;
(若2个字符串相等,则返回值为0,因此将strcmp()作为if()条件时要小心一点,不要犯错)
strcpy:
#include<stdio.h>
char* mycpy(char* dst, const char* src)
{
char *p = dst;
while(*src){
*dst = *src;
src++;
dst++;
}
*dst = 0;
return p;
}
int main()
{
char array[] = "vsdgavsdha";
char *dst;
printf("dst = %s",mycpy(dst, array));
return 0;
}
当然while中循环条件可以继续简化,如:
while(*src){
*dst++ = *src++;
} //利用a++的地址加1且本身值为+1之前的地址特性来简化代码。
继续,*src其实就是*src++,那么就将它写入循环条件。
while(*dst++ = *src++);
注意此时就不需要*dst = 0;这一语句了,这就成了最简型了。
下面是应用较广泛的strchr函数了:
char s[] = "hello";
问题1:
如何寻找第2个'l'?
回答:
char *p = strchr(s,'l');
前面的文章讲过,printf(“%s”,p);实际是输出p所指向的是以第1个’l‘开始的连续空间
即llo;
那么其实就可以将p看成一个新数组: p = strchr(p+1, 'l');这样就得到了第2个'l'的地址。同理可以以此类推。
问题2:如何将’l'之前的字符cpy到另一个字符串中去?
char *p = strchr(s, 'l');
char c = *p;
*p = 0;
char *t = (char*) malloc ((strlen(s) + 1) * sizeof(char));
strcpy(t, s);
*p = c;
注意:先让s的字符串中p地址的字符为'\0';cpy之后将其恢复为原来的状态。
问题3:根据这两个函数写出strcat函数:
char* mycat(char* dst, const char* src)
{
char *p = dst;
while(*dst != 0){
dst++;
}
while(*dst++ = *src++);
return p;
}
大功告成了。