【c语言】——字符串功能的实现(补充)

上一篇文章我们简要的介绍了一下字符串,并实现了字符串的部分功能,这篇文章就让我们来实现字符串的其余功能吧~
1、strncat
字符串的连接,连接之后会带上\0,若是字符串不够要求的长度,直接忽略,不用添0

char* my_strncat(char* dest ,char* str,int count)
{
char* start = dest;
while(*dest)
++dest;
while(*str && count)
{
*dest++ = *str++;
--count;
}
*dest = *str;
return start;
}
int main()
{
char str[20] = "hello \0aaaaa";
my_strncat(str,"world",10);
printf("%s\n",str);
return 0;
}

2、strcmp
字符串的比较(ASII值的比较)

int my_strcmp(const char* str,const char* src)
{
assert(str);
assert(src);
while(*str == *src)
{
if(*str == '\0')
return 0;
str++;
src++;
}
if(*str - *src)
return 1;
else 
return -1;
}
int main()
{
int ret = my_strcmp("abdwd","jwhdi");
printf("%d\n",ret);
return 0;
}

3、atoi
字符串转成数字

static int atoi(const char* str)
{
int result = 0;
int sign = 1;
assert(str != NULL);
while(*str == ' ' || *str == '\t' || *str == '\n')
++str;
if(*str == '-')
{
sign = -1;
++str;
}
else if(*str == '+')
{
++str;
}
while(*str >= '0' && *str <='9')
{
result = result*10 + *str -'0';
++str;
}
return sign*result;
}

4、itoa
数字转化成字符串

char *itoa(int val,char *buf,unsigned radix)
{
char *p;
char *firstdig;
char temp;
unsigned digval;
p =buf;
if(val < 0)
{
*p++ = '-';
val = (unsigned long )(-(long)val);
}
firstdig = p;
do
{digval =(unsigned)( val % radix);
val /= radix;
*p++ = (char)(digval + '0');
}while(val > 0);
*p-- = '\0';
do
{
temp = *p;
*p = *firstdig;
*firstdig = temp;
--p;
++firstdig;
}while(firstdig < p);
return buf;
}

5、strncpy
不把’\0’拷贝。如果字符串不够要求的长度,自动补0

char* my_strncpy(char* dest,char* str,int count)
{
while(*str && count)
{
*dest++ = *str++;
--count;
}
while(count)
{
*dest++ = '\0';
--count;
}
return dest;
}

5.1strncpy
不把’\0’拷贝。如果字符串不够要求的长度,自动补0

char* my_strncpy(char* dest,char* str,int count)
{
while(*str && count)
{
*dest++ = *str++;
--count;
}
while(count)
{
*dest++ = '\0';
--count;
}
return dest;
}
int main()
{
char str[20] = "aaaaaaaaa";
my_strncpy(str,"hello world",5);
printf("%s\n",str);
return 0;
}

6、strncmp

//减法运算判断
int my_strncmp1(const char*src,const char* dest,size_t count)
{
assert(NULL != dest && NULL != src);
int ret = 0;
while(count-- && ! (ret = *(unsigned char*)src -*(unsigned char*)dest) && *dest)
{
src++;
dest++;
}
if(ret < 0)
{
ret = -1;
}
else if(ret > 0)
{
return 1;
}
return ret;
}
//比较运算符
int my_strncmp2(const char* dest,const char* src,size_t count)
{
assert(NULL != dest && NULL != src);
while(--count && (*dest) && (*src == *dest))
{
*dest ++;
*src++;
}
if(*(unsigned char*)dest > *(unsigned char*)src)
return 1;
else
return 0;
}
int main()
{
int ret = my_strncmp2("abcdef","abcdefgh",8);
printf("%d\n",ret);
return 0;
}

7、strstr
若是找到字符串,返回该字符串开始的后面所有字符串,
若是找到字符串则返回空串(null)

 if(*str == '\0')//如果没有子串就返回原来字符串
  return ((char*)dest);
 while(*dest)//依次遍历字符串
 {
  s1 = dest;
  s2 = (char*)str;
  //当dest,str有相同的字符时才进入循环
  while(*s1 && *s2 && !(*s1 - *s2))
   s1++,s2++;
  //当子串走完过后返回字符串
  if(!*s2)
   return(dest);
  //母串一直在遍历
  dest++;
 }
 return(NULL);
}
int main()
{
 const char* tmp = my_strstr("abcderfgjk","der");
 printf("%s\n",tmp);
 return 0;
}
发布了62 篇原创文章 · 获赞 7 · 访问量 2587

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/104282792