一些常见的C语言字符串操作

#字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题。
如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。
#include stdio.hvoid rechange_str(char *str){ int i, len; char tmp; if (null == str) {  return ; } len = strlen(str); for (i = 0; i < len/2; i ++) {  tmp = str[i];  str[i] = str[len-i-1];  str[len-i-1] = tmp; }}int main(void){ char str[20] = hello,world; printf(%s,str); rechange_str(str); printf(%s,str); return (0);}  程序输出
hello,worlddlrow,olleh--------------------------------process exited after 0.02841 seconds with return value 0请按任意键继续. . . #整型转字符串 实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-f。
用个位数对应值转为字符,注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作
下面这段代码需要好好研究一下,最好自己运行试试。
#include stdio.hchar *sky_itoa(int value, char *str, unsigned int radix){ char list[] = 0123456789abcdef; unsigned int tmp_value; int i, j, k; if (null == str) {  return null; } if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {  return null; } i = 0; k = 0; if (radix == 10 && value < 0) {  tmp_value = (unsigned int)(0 - value);  str[i++] = '-';  k = 1; } else {  tmp_value = (unsigned int)value; } do {  str[i++] = list[tmp_value%radix];  tmp_value /= radix; } while(tmp_value); str[i] = ''; //翻转 char tmp; for (j = k; j < (i+k)/2; j++) {  tmp = str[j];  str[j] = str[i+k-j-1];  str[i+k-j-1] = tmp; } return str;}int main(void){ int a = 1254545; char str[100] ={0}; printf(%s,sky_itoa(a,str,2)); printf(%s,sky_itoa(a,str,8)); printf(%s,sky_itoa(a,str,10)); printf(%s,sky_itoa(a,str,16)); return (0);}  程序输出
10011001001001001000146222211254545132491--------------------------------process exited after 0.02963 seconds with return value 0请按任意键继续. . . #字符串复制 实现逻辑,逐个赋值直到遇到''停止即可
#include stdio.hchar *sky_strcpy(char *dst, const char *str){ if (null == dst ||  null == str) {  return null; } char *ret = dst; while (*str != '') {  *dst ++ = *str ++; } return ret; } int main(void){ char str_1[100] = hello,world; char str[100] ={0}; sky_strcpy(str,str_1); printf(str_1:%s,str_1); printf(str:%s,str); return (0);}  程序输出
str_1:hello,worldstr:hello,world--------------------------------process exited after 0.03334 seconds with return value 0请按任意键继续. . . #字符串比较 1、正常比较是否相同 实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同
#include stdio.hint sky_strcmp(char *dst, char *str){ int i, len; if (null == dst || null == str) {  return 0; } if (strlen(dst) != strlen(str)) {  return 0; } len = strlen(dst); for (i = 0; i = 'a' && (c) <= 'z') ? ((c) - 'a' + 'a') : (c)) int sky_strcmp(char *dst, char *str) {  int i, len;  if (null == dst || null == str) {   return 0;  }  if (strlen(dst) != strlen(str)) {   return 0;  }  len = strlen(dst);  for (i = 0; i < len; i++) {   if (convert(*dst) != convert(*str)) {    return 0;   }   dst ++;   str ++;  }  return 1; }   int main(void) {  char str_1[100] = hello,world;  char str_2[100] = hello,world;  char str[100] = adfs;    printf(%d,sky_strcmp(str_1,str));  printf(%d,sky_strcmp(str_1,str_2));  return (0); }  程序输出
01--------------------------------process exited after 0.04624 seconds with return value 0请按任意键继续. . . #memcpy函数实现 实现逻辑,主要就是逐个赋值即可完成 
1、不考虑拷贝覆盖问题
#include stdio.h#include string.hvoid *sky_memecpy(void *dst, const void *str, int n){ if (null == dst || null == str || n <= 0) {  return null; } char *pdst = (char *)dst; char *pstr = (char *)str; while (n --) {  *pdst ++ = *pstr ++; } return dst;}int main(void){ char str_1[100] = hello,world; char str_2[100] = sdfsdfs; sky_memecpy(str_2,str_1,strlen(str_1)); printf(%s,str_2); return (0);}  程序输出
hello,world--------------------------------process exited after 0.02516 seconds with return value 0请按任意键继续. . . 2、考虑拷贝覆盖问题
拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,使用第二个函数就没有出现问题。
原因是,我们源字符串和目的字符串的地址都是一样的,我们希望把字符串往后移动一个位置,但是实际上出现了问题。
 #include stdio.h #include string.h  void *sky_memecpy_1(void *dst, const void *str, int n) {  if (null == dst || null == str || n <= 0) {   return null;  }  char *pdst = (char *)dst;  char *pstr = (char *)str;  while (n --) {   *pdst ++ = *pstr ++;  }  return dst; }  void *sky_memecpy(void *dst, const void *str, int n) {  if (null == dst || null == str || n  pstr && pdst < pstr + n) {   pdst = pdst + n - 1;   pstr = pstr + n - 1;   while (n --) {    *pdst -- = *pstr --;   }  } else {   while (n --) {    *pdst ++ = *pstr ++;   }  }  return dst; }  int main(void) {  char str_1[100] = hello,world;  char str_2[100] = hello,world;  sky_memecpy_1(str_1+1,str_1,strlen(str_1));  printf(%s,str_1);    sky_memecpy(str_2+1,str_2,strlen(str_2));  printf(%s,str_2);  return (0); }  程序输出
hhhhhhhhhhhhhhello,world--------------------------------process exited after 0.02773 seconds with return value 0请按任意键继续. . . 针对上面的拷贝覆盖问题,单独写了一个测试程序
#include stdio.h#include string.hvoid *sky_memecpy(void *dst, const void *str, int n){ if (null == dst || null == str || n str:%c,*pdst,*pstr);  *pdst ++ = *pstr ++; } return dst;}int main(void){ char str_1[100] = hello,world; sky_memecpy(str_1+1,str_1,strlen(str_1)); printf(%s,str_1); return (0);}  程序输出
dst:e--->str:hdst:l--->str:hdst:l--->str:hdst:o--->str:hdst:,--->str:hdst:w--->str:hdst:o--->str:hdst:r--->str:hdst:l--->str:hdst:d--->str:hdst: --->str:hhhhhhhhhhhhh--------------------------------process exited after 0.02575 seconds with return value 0请按任意键继续. . . 初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。好了,就这些内容,希望大家好好消化,这些代码对面试很有帮助。

原文标题:面试必备!常见的c语言字符串操作
文章出处:【微信公众号:嵌入式arm】欢迎添加关注!文章转载请注明出处。

携手地平线、楚航科技,极目智能产品方案亮相上海车展
基于一款全球范围流行的加密货币支付软件Bitpay介绍
朗德万斯宣布将启用LEDVANCE作为灯具品牌
安防芯片国产化迫在眉睫 整个行业技术成本逐渐降低
洲明科技--争当景观照明与显示屏“王者”
一些常见的C语言字符串操作
荣耀20i真机照公布 号称自拍神器
光纤通信设备有哪些?光纤从设备什么意思?
浅析基于微流控技术的外泌体分离方法
徕卡发布M卡口人像定焦镜头,由8片6组镜片构成拥有f/1.5大光圈
利用PSD3XX与ADMC401接口设计的无功发生器系统方案
【新专利介绍】一种改进电表
单片4 1/2位A/D转换器7135的特点、引脚功能及应用范围
如何制作树莓派相框
3D打印在医疗领域让不可能变成可能
桑顿新能源如何存活到后补贴时代
三星电子将于4月在韩国市场发布首款5G智能手机
电源变压器简易设计
一江春水向东流
三维数据的问题何时才能解决呢?