C语言string库strcpy、strcmp、strcat函数的使用

  目录

  C语言string库strcpy、strcmp、strcat函数

  即string copy

  语法格式为strcpy(str1, str2), 作用是将str2赋值给str1

  使用方法类似于

  char str1[10], str2[] = "abc";

  strcpy(str1, "bcd");

  strcpy(str1, str2);

  printf("%s", str1); // abc

  str2可以是字符串, 也可以是字符串首地址(指针)。

  strcpy会从传入的地址开始写入, 如代码为,程序会从str1第二个元素开始写入str2的值

  值得注意的是, strcpy将指定内容添加到字符串中后, 会在末尾添加一个空字节‘0’, 以表示字符串结束。

  如:

  char str[5] = "abcde";

  strcpy(str, "xyz");

  因此,使用strcpy将某字符串的内容赋予长度为n的字符串时, 被复制的字符串长度最大为n-1(留一个位置给’0’),否则会有溢出的

  报错类似:builtin_memcpy’ writing 11 bytes into a region of size 10 overflows the destination 。

  strcat(str1, str2)

  将str2拼接到str1的末尾

  char str[10] = "abc";

  strcat(str ,"cde");

  printf("%s", str); // abccde

  使用strcat(str1, str2)时, 程序会从str1第一个空字节开始将str2的内容写入, 并在末尾重写空字节。

  所以, str1中必须有足够的空间来放入str2,即str1原先内容后面至少要有strlen(str2)+1个字节。

  即string compare

  用于比较两个字符串。

  规则是从两个字符串第一个字符开始比较(ascii), 若相同则比较下一个字符,直到不同为止;若str1对应位置的字符的ascii值小于str2的, 返回一个负整数(一般为-1, 取决于系统, 有的会返回ascii码的差值),反之返回一个正整数(1);若两个字符串的长度和每个字符都相同, 则返回0。

  参考:

  C语言实现各类string函数

  1.实现strcpy(字符串复制)

  函数原型:char strcpy(char dest, const char src);

  strcpy把含有’0’结束符的字符串复制到另一个地址空间,返回值的类型为char。

  代码:

  #include

  #include

  #include

  char* my_strcpy(char *des, char const *stc)

  {

  assert(des != NULL);

  assert(stc != NULL);

  char* res = des;

  while (*stc){

  *des = *stc;

  stc++;

  des++;

  }

  return res;

  }

  int main()

  {

  char str1[100] = { 0 };

  char *str2 = "i am wangwenqian.";

  my_strcpy(str1, str2);

  printf("%s

  ", str1);

  system("pause");

  return 0;

  }

  2.实现strcat

  函数原型:extern char strcat(char dest, const char src);

  功能:把src所指向的字符串(包括“0”)复制到dest所指向的字符串后面(删除dest原来末尾的“0”)。要保证dest足够长,以容纳被复制进来的src。*src中原有的字符不变。返回指向dest的指针。

  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

  代码:

  #include

  #include

  #include

  char* my_strcat(char *des, char const *stc)

  {

  char* ret = des;

  assert(des != NULL);

  assert(stc != NULL);

  while (*des){   //des指向0

  des++;

  }

  while (*stc){  //拼接stc

  *des = *stc;

  des++;

  stc++;

  }

  return ret;

  }

  int main()

  {

  char str1[100] = "abc";

  char *str2 = "cdefg";

  my_strcat(str1, str2);//str1实际传址

  printf("%s

  ", str1);

  system("pause");

  return 0;

  }

  3.实现strstr

  函数原型:extern char *strstr(char *str1, const char *str2);

  strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

  代码:

  #include

  #include

  #include

  char* my_strstr(const char *str1, const char *str2)

  {

  assert(str1);

  assert(str2);

  char *ret = (char *)str1;

  char *res = (char *)str2;

  while (*ret){

  char cp = (char *)str1;

  if (*ret == *res && *res != '0'){  //当*ret与*res相等且*res不为0时,俩个指针同时向后移动

  ret++;

  res++;

  }

  if (*res == "0"){  //*res为0,说明满足了上一个if条件,且找到字串

  return cp;

  }

  if (*ret == '0'){  //*ret为0,表示其一直向后移动,说明并没有找到字串

  return NULL;

  }

  ret++;  //让ret一直向后移动

  }

  }

  int main()

  {

  char *str1 = "question";

  char *str2 = "tion";

  char *ret = my_strstr(str1, str2);

  printf("%p

  ",ret );

  system("pause");

  return 0;

  }

  4.实现strchr

  函数原型:extern char *strchr(const char *s,char c)

  可以查找字符串s中首次出现字符c的位置。

  代码:

  #include

  #include

  char * my_strchr(const char * str, char c)

  {

  while (*str != '0' &&  *str != c){

  str++;

  }

  return str;

  }

  int main()

  {

  char arr[] = "student";

  char c = 'u';

  char *ret = my_strchr(arr, c);

  printf("%s

  ", arr);

  system("pause");

  return 0;

  }

  5.实现strcmp

  函数原型:extern int strcmp(const char *s1,const char *s2);

  比较俩个字符串。若str1=str2,则返回零;若str1str2,则返回正数。

  #include

  #include

  #include

  int strcmp(const char *str1, const char *str2)

  {

  assert(str1);

  assert(str2);

  while (*str1 && (*str1==*str2)){

  str1++;

  str2++;

  }

  if ((*(unsigned char *)str1) > (*(unsigned char *)str2))

  return 1;

  else if ((*(unsigned char *)str1) < (*(unsigned char *)str2))

  return -1;

  else

  return 0;

  }

  int main()

  {

  char *str1 = "abcd";

  char *str2 = "abcdef";

  int ret = strcmp(str1, str2);

  printf("%d

  ", ret);

  system("pause");

  return 0;

  }

  6.实现memcpy

  函数原型:void *memcpy(void *dest, const void *src, size_t n);

  从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

  代码:

  #include

  #include

  #include

  #define N 20

  char * my_memcpy(char *des, char *stc, int len)

  {

  assert(des);

  assert(stc);

  char *res = des;

  while (len--){

  *des = *stc;

  des++;

  stc++;

  }

  return res;

  }

  int main()

  {

  char arr1[N] = "";

  char arr2[N] = "i am a student";

  my_memcpy(arr1, arr2, 6);

  printf("%s

  ",arr1);

  system("pause");

  return 0;

  }

  7.实现memmove

  函数原型:void memmove( void dest, const void* src, size_t count );

  memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

  代码:

  #include

  #include

  #define N 20

  char *my_memmove(char *des, char *str, int len)

  {

  void *ret = des;

  //无内存重叠

  if (des <= str || des >= str + len){

  while (len--){

  *des = *str;

  des++;

  str++;

  }

  }

  else{

  des += (len - 1);

  str += (len - 1);

  while (len--){

  *des = *str;

  des--;

  str--;

  }

  }

  return ret;

  }

  int main()

  {

  char arr1[N] = "123456789";

  my_memmove(arr1+3, arr1, 5);

  printf("%s

  ", arr1);

  system("pause");

  return 0;

  }

  memmove代码比较难懂,建议大家在纸上画一下。

  总结

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

  您可能感兴趣的文章: