我是靠谱客的博主 灵巧玉米,最近开发中收集的这篇文章主要介绍判断字符为空_面试中常见的C语言字符串操作1、颠倒字符串2、整型转字符串3、字符串复制4、字符串比较5、memcpy函数实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

d4a0ff458f2da56d074e3e9b43948205.png

0、主要内容:

1、颠倒字符串

2、整型转字符串

3、字符串复制

4、字符串比较

5、memcpy函数实现

1、颠倒字符串

1.1、用递归颠倒
#include /* 递归调用  */void Reverse(){  char c;  scanf_s("%c", &c);  if (c != 'n')  {    Reverse();    printf("%c", c);  }}/*  主函数  */int main(){  printf("Enter a sentence: ");  Reverse();  printf("rn");  return 0;}
1.2、用缓存变量颠倒

通过strlen获取字符串长度,通过 len/2 进行交叉赋值,不需要考虑len是奇数还是偶数的问题。因为如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。

#include /* 颠倒字符串  */void Reverse(char *str){  int index = 0;//字符串中第几个字符  int len = 0;//字符串的长度  char temp = '';//暂存字符串  if (NULL == str) //字符串为空,直接返回  {    return;  }  len = strlen(str);//得到字符串元素个数  for (index = 0; index < len / 2; index++) //依次首尾交换字符串元素  {    temp = str[index];  //将前面的字符放入缓存temp    str[index] = str[len - index - 1]; //后面的字符放入前面的字符    str[len - index - 1] = temp; //缓存中的字符放入后面的位置  }}/*  主函数  */int main(){  char string[20] = "abcdefgh";  printf("最初的字符串:%srn", string);  Reverse(string);  printf("颠倒后的字符串:%srn", string);  printf("rn");  return 0;}

程序输出:

最初的字符串:abcdefgh                                                                                                   len=8                                                                                                                  颠倒后的字符串:hgfedcba 请按任意键继续. . .  

2、整型转字符串

根据转换进制,依次得到待转数字最后以为相应的字符,存入字符串数组中,再颠倒字符串数组即可。

#include /* 颠倒字符串  */void ReverseStr(char *str)  //上面写过了{  int index = 0;//字符串中第几个字符  int len = 0;//字符串的长度  char temp = '';//暂存字符串  if (NULL == str) //字符串为空,直接返回  {    return;  }  len = strlen(str);//得到字符串元素个数  for (index = 0; index < len / 2; index++) //依次首尾交换字符串元素  {    temp = str[index];  //将前面的字符放入缓存temp    str[index] = str[len - index - 1]; //后面的字符放入前面的字符    str[len - index - 1] = temp; //缓存中的字符放入后面的位置  }}/* 整形转为不同进制的字符串  */char *int2string(int value, char *str, unsigned int radix){  const char list[] = "0123456789ABCDEF";//const,不可改变的  unsigned int tmp_value; //暂存待转数字  int index = 0;//字符串数组的序号  if (NULL == str) //接收转换结果的字符串为空,则直接返回  {    return NULL;  }  if (2 != radix && 8 != radix && 10 != radix && 16 != radix) //要转换的进制不是2,8,10,16  {    return NULL;  }  if (value < 0) //负数转为十进制字符串  {    tmp_value = (unsigned int)(0 - value);    str[index++] = '-'; //添加负号  }  else //待转数字为正数  {    tmp_value = (unsigned int)value;  }  do {    str[index++] = list[tmp_value%radix];//得到对应进制的最低位字符    tmp_value /= radix; //更新待转数字的缓存,去掉最后一位字符  } while (tmp_value); //直到待转数字缓存为0  str[index] = ''; //添加字符串结束标志 ''    ReverseStr(str);//翻转字符串  return str;}/*  主函数  */int main(){  int a = 12345678;  char string[100] = {0};//100个元素的字符数组  printf("%sn", int2string(a, string, 2));  printf("%sn", int2string(a, string, 8));  printf("%sn", int2string(a, string, 10));  printf("%sn", int2string(a, string, 16));  printf("rn");  return 0;}

程序输出:

1011110001100001010011105706051612345678BC614E请按任意键继续. . .

3、字符串复制

实现逻辑:逐个赋值直到遇到字符串结束标志''停止。

#include /* destStr:复制后的字符串*  sourStr:最初的字符串*/ void CopyStr(char *destStr, const char *sourStr) //{  if (NULL == destStr || NULL == sourStr)//源字符串或者目标字符串都是空,则返回  {    return ;  }  while (*sourStr != '') //直到最初字符串的最后一个元素  {    *destStr++ = *sourStr++; //直接复制对应字符,同时地址加1  }}/*  主函数  */int main(){  char str_1[100] = "hello,world";  char str[100] = { 0 };  CopyStr(str, str_1);  printf("最初的字符串:%sn", str_1);  printf("复制后的字符串:%sn", str);  printf("rn");  return 0;}

程序输出:

最初的字符串:hello,world复制后的字符串:hello,world请按任意键继续. . .

4、字符串比较

1、首先判断字符串长度是否相同,若相同逐个比较对应字符是否完全相同

#include /* 比较两个字符串是否相同*  1:相同,0:不同*/int StrComp(char *str1, char *str2){  int len = 0; //保存字符串的长度  int index = 0; //字符的序号  if (NULL == str1 || NULL == str2)  //其中一个字符串为空,直接返回0  {    return 0;  }  if (strlen(str1) != strlen(str2)) //判断两个字符串长度是否相同  {    return 0;  }  len = strlen(str1); //得到字符串长度  for (index = 0; index < len; index++)   {    if (*str1++ !=  *str2++) //依次比较对应字符    {      return 0; //若有一个不同就返回0    }  }  return 1;}/*  主函数  */int main(){  char str_1[100] = "hello,world";  char str_2[100] = "hello,world";  char str[100] = "adfs";  printf("比较str_1和str:%dn", StrComp(str_1, str));  printf("比较str_1和str_2:%dn", StrComp(str_1, str_2));  printf("rn");  return 0;}

程序输出

比较str_1和str:0比较str_1和str_2:1请按任意键继续. . .

2、忽略大小写字符串比较。将每个字符都转换为小写,再依次比较。

#include #define CONVERT(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) - 'A' + 'a') : (c))//若为大写字母,则转化为小写字母/* 比较两个字符串是否相同*  1:相同,0:不同*/int StrComp(char *str1, char *str2){  int len = 0; //保存字符串的长度  int index = 0; //字符的序号  if (NULL == str1 || NULL == str2)  //其中一个字符串为空,直接返回0  {    return 0;  }  if (strlen(str1) != strlen(str2)) //判断两个字符串长度是否相同  {    return 0;  }  len = strlen(str1); //得到字符串长度  for (index = 0; index < len; index++)   {    if (CONVERT(*str1) != CONVERT(*str2))    {      return 0; //若有一个不同就返回0    }    *str1 ++; //地址递增    *str2 ++;        }  return 1;}/*  主函数  */int main(){  char str_1[100] = "HEllo,World";  char str_2[100] = "hello,world";  char str[100] = "adfs";  printf("比较str_1和str:%dn", StrComp(str_1, str));  printf("比较str_1和str_2:%dn", StrComp(str_1, str_2));  printf("rn");  return 0;}

程序输出

比较str_1和str:0比较str_1和str_2:1请按任意键继续. . .

5、memcpy函数实现

实现逻辑,主要就是逐个赋值即可完成 

1、不考虑拷贝覆盖问题

#include /* dest:复制后的目的地址, sour:复制前的目标地址,即要复制的内容地址*/void *MemoryCopy(void *dest, const void *sour, int len){  if (NULL == dest || NULL == sour || len <= 0) //其中一个字符串为空或复制个数小于等于0,直接返回  {    return NULL;  }  char *pDest = (char *)dest;//创建两个指向要操作字符串的指针  char *pSour = (char *)sour;  while (len--)   {    *pDest++ = *pSour++;  }  return dest;}/*  主函数  */int main(){  char str_1[100] = "HELLO";  //,world";  char str_2[100] = "sdfsdfwrs";  printf("复制前str_2:%sn", str_2);  printf("开始复制str_1到str_2 .rn");  MemoryCopy(str_2, str_1, strlen(str_1));  printf("复制后str_2:%sn", str_2);  printf("rn");  return 0;}

程序输出:

复制前str_2:sdfsdfwrs开始复制str_1到str_2 .复制后str_2:HELLOfwrs请按任意键继续. . .

2、考虑拷贝覆盖问题

拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,原因是复制第一个元素时,源地址中的第一个元素复制到目标地址中的第一个元素时,源地址中的第二个元素也被改变了。

#include #include /* dest:复制后的目的地址, sour:复制前的目标地址,即要复制的内容地址*/void *MemoryCopy_1(void *dest, const void *sour, int len){  if (NULL == dest || NULL == sour || len <= 0) //其中一个字符串为空或复制个数小于等于0,直接返回  {    return NULL;  }  char *pDest = (char *)dest;//创建两个指向要操作字符串的指针  char *pSour = (char *)sour;  while (len--)  {    *pDest++ = *pSour++;  }  return dest;}/* dest:复制后的目的地址, sour:复制前的目标地址,即要复制的内容地址*/void *MemoryCopy_2(void *dest, const void *sour, int len){  if (NULL == dest || NULL == sour || len <= 0) {    return NULL;  }  char *pDest = (char *)dest;  char *pSour = (char *)sour;  if (pDest > pSour && pDest < pSour + len)  {    pDest = pDest + len - 1;    pSour = pSour + len - 1;    while (len--) {      *pDest-- = *pSour--;//内存有重叠区,从最后一个字符开始复制    }  }  else  //内存没有重叠  {    while (len--) {      *pDest++ = *pSour++;//从头开始复制    }  }  return dest;}/*  主函数  */int main(){  char str_1[100] = "heLlo,world";  char str_2[100] = "heLlo,world";  printf("复制前str_1:%srn", str_1);  MemoryCopy_1(str_1 + 1, str_1, strlen(str_1));  printf("复制后str_1:%srnrn", str_1);  printf("复制前str_2:%srn", str_2);  MemoryCopy_2(str_2 + 1, str_2, strlen(str_2));  printf("复制后str_2:%srn", str_2);  printf("rn");  return 0;}

程序输出:

复制前str_1:heLlo,world复制后str_1:hhhhhhhhhhhh复制前str_2:heLlo,world复制后str_2:hheLlo,world请按任意键继续. . .

针对上面MemoryCopy_1复制的问题,打印输出复制过程,即可明白。

#include /* dest:复制后的目的地址, sour:复制前的目标地址,即要复制的内容地址*/void *MemoryCopyTest(void *dest, const void *sour, int len){  if (NULL == dest || NULL == sour || len <= 0) //其中一个字符串为空或复制个数小于等于0,直接返回  {    return NULL;  }  char *pDest = (char *)dest;//创建两个指向要操作字符串的指针  char *pSour = (char *)sour;  while (len--)  {    printf("sour:%c--->dest:%cn", *pSour, *pDest);    *pDest++ = *pSour++;  }  return dest;}/*  主函数  */int main(){  char str_1[100] = "heLlo,world";  printf("复制前str_1:%srn", str_1);  MemoryCopyTest(str_1 + 1, str_1, strlen(str_1));  printf("复制后str_1:%srnrn", str_1);  printf("rn");  return 0;}

程序输出:

复制前str_1:heLlo,worldsour:h--->dest:esour:h--->dest:Lsour:h--->dest:lsour:h--->dest:osour:h--->dest:,sour:h--->dest:wsour:h--->dest:osour:h--->dest:rsour:h--->dest:lsour:h--->dest:dsour:h--->dest:复制后str_1:hhhhhhhhhhhh请按任意键继续. . .

初始的时候,dest指向 e 字符,sour 指向h 字符,然后每次都是dest先移动,sour再移动,要复制的下一个字符也变成了h,就出现了dst被h字符所覆盖。

大家可以在VC++6.0上面试试,也可以使用网页版菜鸟工具:

https://c.runoob.com/compile/11

END

更多内容请关注公众号:嵌入式的路上

b8443a4a57cdb8f8eed7fcc1c9aab6bb.png

根据网络内容整理。

版权归原作者所有,如有侵权,请联系删除。

最后

以上就是灵巧玉米为你收集整理的判断字符为空_面试中常见的C语言字符串操作1、颠倒字符串2、整型转字符串3、字符串复制4、字符串比较5、memcpy函数实现的全部内容,希望文章能够帮你解决判断字符为空_面试中常见的C语言字符串操作1、颠倒字符串2、整型转字符串3、字符串复制4、字符串比较5、memcpy函数实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部