strcat:
一个简单的strcat,我在实际的coding中,还是发现了问题,先罗列一下
1.主要在strcat_m,一开始在line8,while(tmp++ != '\0') 和下面line9是不一样的。
line8:在tmp指向'\0'后,又向后移位一个单位,所以最后tmp指向'\0'后一个单位
line9: 这个是正确的指向'\0'
2.在line13,如果需要strcat_m很多次,比如
c = strcat_m(a,b);
c = strcat_m(c,d);
return的--tmp会直接指向最后一个字符,这样方便后面的继续strcat而不再需要遍历strDest到'\0',也更有效率。
#include<stdio.h>
#include<assert.h>
char* strcat_m(char* strDest, const char* strSrc)
{
assert(strDest != NULL && strSrc != NULL);
char *tmp = strDest;
//while(*tmp++ != '\0');
while(*tmp != '\0')
tmp++;
while(*strSrc != '\0')
*tmp++ = *strSrc++;
//return --tmp;
return strDest;
}
void main(void)
{
char *buffer;
char str[100] = "hello";
char* str1 = "world";
buffer = strcat_m(str,str1);
printf("%s\n",buffer);
}
strcmp:
#include<stdio.h>
int strcmp(const char* str1, const char* str2)
{
int ret=0;
while(!(ret=(*str1- *str2)) && *str1 && *str2 )
{
str1++;
str2++;
}
if (ret<0)
return -1;
else if (ret >0)
return 1;
else
return ret;
}
int main(void)
{
char* p;
char* str1 = "hello";
char* str2 = "hellohe";
printf("%d\n",strcmp(str1,str2));
}
strcmp另一种写法,考虑到case insensitive和cmp的词长,其实也是android原生态的写法
int strncmp(char* s1, const char* s2, int n)
{
assert(s1 != NULL && s2 != NULL);
char tmp_s1,tmp_s2;
int index=0;
do{
if((tmp_s1 = *s1++)>='A' && (tmp_s1 <= 'Z'))
tmp_s1 -= 'A'-'a';
if((tmp_s2 = *s2++)>='A' && (tmp_s2 <= 'Z'))
tmp_s2 -= 'A'-'a';
index++;
}while((tmp_s1==tmp_s2) && tmp_s1 && index<n);
return tmp_s1-tmp_s2;
}
strcpy:
item1 ---->*dest = ''\0; 可以return string 抑或不return
item2 ---->dest的string一定要有地方存,若没有malloc,程序报错
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#include<assert.h>
void strcpy(char *dest,const char* src)
{
assert(src != NULL);
while(*src != '\0')
*dest++ = *src++;
*dest = '\0';
}
int main(int argc, char* argv[])
{
char *p = "helloword";
char *q = (char *)malloc(10);
strcpy(q,p);
printf("%s\n",q);
return 0;
}
strrchr:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#include<assert.h>
char *my_strrchr(char* p, char h)
{
assert(p!=NULL);
char *tmp=NULL;
while(*p != '\0'){
if(*p == h)
tmp = p;
p++;
}
return tmp;
}
int main(int argc, char* argv[])
{
char *p = "helloworld";
char *cout = my_strrchr(p,'l');
printf("%s\n",cout);
return 0;
}
strchr:
**加上了对大小写的判断
char *my_strchr(char* p, char h)
{
assert(p!=NULL);
if(h>='A' && h<='Z')
h = h-'A'+'a';
while(*p!='\0')
{
if(*p == h || (*p-'A'+'a')== h)
return p;
else
p++;
}
if(*p == '\0')
return NULL;
}
strstr:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#include<assert.h>
char *my_strstr(char* p1, char* p2)
{
assert(p1!=NULL && p2!= NULL);
for(;*p1!='\0';p1++)
{
char *tmp_p1=p1;
char *tmp_p2=p2;
while(*tmp_p2 != '\0' && *tmp_p1 != '\0'){
if(*tmp_p1 == *tmp_p2){
tmp_p1++;
tmp_p2++;
}
else
break;
}
if(*tmp_p2 == '\0')
return p1;
}
return NULL;
}
int main(int argc, char* argv[])
{
char *p = "helloworld";
char *q = "llo";
char *cout = my_strstr(p,q);
printf("%s\n",cout);
return 0;
}