常见的C语言字符串操作
时间:2021-11-24 23:28:00
#字符串倒序输入
完成逻辑,经由过程strlen猎取字符串长度,而后经由过程 len/2 举行交织赋值,这里需求注重,不需要思量len是奇数仍是偶数的题目。
假如len是奇数,最初一个字符就不需求倒序,如果是偶数,最初两个字符就倒序。
#include "stdio.h" void 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\n",str); rechange_str(str); printf("%s\n",str); return (0);}
步伐输入
hello,worlddlrow,olleh--------------------------------Process exited after 0.02841 seconds with return value 0请按任意键连续. . .
#整型转字符串
完成逻辑,每一个整数看其转换进制,从个位到十位百位都可以经由过程%操纵加之/操纵取得,再用一个字符数组保管0-F。
用个位数对应值转为字符,注重转换出的字符串是反向的,还要思量传入的若是正数若何处置,再用翻转字符串实现最初全部操纵
上面这段代码需求好好研讨一下,最佳本人运转尝尝。
#include "stdio.h" char *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] = '\0'; //翻转 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\n",sky_itoa(a,str,2)); printf("%s\n",sky_itoa(a,str,8)); printf("%s\n",sky_itoa(a,str,10)); printf("%s\n",sky_itoa(a,str,16)); return (0);}
10011001001001001000146222211254545132491--------------------------------Process exited after 0.02963 seconds with return value 0请按任意键连续. . . #字符串复制
#include "stdio.h" char *sky_strcpy(char *dst, const char *str){ if (NULL == dst || NULL == str) { return NULL; } char *ret = dst; while (*str != '\0') { *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\n",str_1); printf("str:%s\n",str); return (0);} str_1:hello,worldstr:hello,world--------------------------------Process exited after 0.03334 seconds with return value 0请按任意键连续. . . #字符串比拟
#include "stdio.h" 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 (*dst++ != *str++) { return 0; } } return 1;} int main(void){ char str_1[100] = "hello,world"; char str_2[100] = "hello,world"; char str[100] = "adfs"; printf("%d\n",sky_strcmp(str_1,str)); printf("%d\n",sky_strcmp(str_1,str_2)); return (0);} 01--------------------------------Process exited after 0.02802 seconds with return value 0请按任意键连续. . .
#include "stdio.h"
#define CONVERT(c) (((c) >= '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\n",sky_strcmp(str_1,str)); printf("%d\n",sky_strcmp(str_1,str_2)); return (0); }
01--------------------------------Process exited after 0.04624 seconds with return value 0请按任意键连续. . . #memcpy函数完成
#include "stdio.h"
#include "string.h" void *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\n",str_2); return (0);}
heLlo,world--------------------------------Process exited after 0.02516 seconds with return value 0请按任意键连续. . .
拷贝遮盖咱们在拷贝字符串时间需求注重的一个题目上面的示例步伐应用第一个函数时间涌现题目应用第二个函数就没有涌现题目。
原因是咱们源字符串目标字符串地点都是同样咱们但愿把字符串今后挪移一个地位然则实际上涌现题目。
#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 <= 0) { return NULL; } char *pdst = (char *)dst; char *pstr = (char *)str; if (pdst > 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\n",str_1); sky_memecpy(str_2+1,str_2,strlen(str_2)); printf("%s\n",str_2); return (0); }
hhhhhhhhhhhhhheLlo,world--------------------------------Process exited after 0.02773 seconds with return value 0请按任意键连续. . . 针对下面的拷贝遮盖题目独自写了一个测试步伐
#include "stdio.h" #include "string.h" void *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 --) { printf("dst:%c--->str:%c\n",*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\n",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字符遮盖。
好了,就这些内容但愿人人好好消化,这些代码口试颇有赞助。