|
#字符串倒序输出% l0 n7 V8 N% ]3 A9 m 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题。 如果len是奇数,最后一个字符就不需要倒序,如果是偶数,最后两个字符就倒序。 #include "stdio.h"void rechange_str(char *str)4 q7 J( w$ \ Q0 w2 @2 X. ?$ o { int i, len; char tmp;4 S- @: V# N9 ~9 I, g* T$ M9 V if (NULL == str) {: ~: w" o% [3 J) Z return ; } len = strlen(str); for (i = 0; i < len/2; i ++) { tmp = str; str = str[len-i-1];# ^- _* p4 J( P5 U str[len-i-1] = tmp;- U5 ~% e. {/ L' w0 S2 ~ } } int main(void) {) F; i* Z) ]1 p; n/ C char str[20] = "hello,world";9 Q; T5 E ^% P printf("%s\n",str); rechange_str(str);3 ^; ^: k; q. p7 E- a printf("%s\n",str);0 }# Y, k& G4 B( f7 b return (0);+ T: h8 |+ g7 S* x" \9 k1 b9 K } 程序输出 hello,world' u0 l8 x6 J2 q4 Y& q8 |- G+ S6 odlrow,olleh0 @/ I6 |# q0 a/ a # W6 ~" t& W6 Q& K1 N -------------------------------- Process exited after 0.02841 seconds with return value 0! r$ w m) I* }5 B. h 请按任意键继续. . .9 v& ?5 K$ V/ T. s #整型转字符串 实现逻辑,每个整数看其转换进制,从个位到十位百位都可以通过%操作加上/操作获得,再用一个字符数组保存0-F。 用个位数对应值转为字符,注意转换出的字符串是反向的,还要考虑传入的若是负数如何处理,再用翻转字符串完成最后整个操作 下面这段代码需要好好研究一下,最好自己运行试试。 #include "stdio.h"! u' G% M y- o# E9 Tchar *sky_itoa(int value, char *str, unsigned int radix) {4 Q r1 Y4 b: j M# R$ s char list[] = "0123456789ABCDEF"; unsigned int tmp_value;. H `, G+ Z9 b& k" ]" _, d/ A int i, j, k; if (NULL == str) { return NULL;& x; v4 \7 q$ `" v9 }# Z }9 ]5 f" T. _' P7 ~: f. u/ g% N, F3 } if (2 != radix && 8 != radix && 10 != radix && 16 != radix) { return NULL;% J% P* H W7 ^$ X7 O }9 x) K2 P2 l6 O- q* V# | i = 0;' U2 P# ?, p' T7 L. M4 a k = 0;# m ~: f* N$ \% F2 c. {: j9 Y if (radix == 10 && value < 0) { tmp_value = (unsigned int)(0 - value); str[i++] = '-'; k = 1;, o$ G; w w& @) w } else { tmp_value = (unsigned int)value;7 ]9 A6 k4 v# q: D } do {) a- V8 [2 ~. ]! r+ ~! I: o str[i++] = list[tmp_value%radix];( t9 _7 M& C, B- ]) N3 W( M tmp_value /= radix; } while(tmp_value); str = '\0';8 }; s2 F( ^7 q% t //翻转 Y8 s& U! R1 _# c5 Y3 e char tmp;- P) y5 J9 Z9 Q! c6 I6 A* z for (j = k; j < (i+k)/2; j++) {% b. D( V! ^) g# p$ w" J tmp = str[j];. |& w7 k6 T6 t9 K& J. a" ] str[j] = str[i+k-j-1];% m3 d7 |0 @3 o- ]* \3 r/ x str[i+k-j-1] = tmp; } return str;+ E$ W3 B( W' \$ a6 I" I0 b }& x& J8 a/ N, k int main(void) {: ~" Z) F% o6 L% b) p' A5 P int a = 1254545; char str[100] ={0}; 7 {2 f: [" [! K printf("%s\n",sky_itoa(a,str,2));) z( u; v I T0 G# r1 g% E 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);8 b8 W" h' R$ @7 z3 ^* B% X } ( I' m, z% ?$ I- I 程序输出 1001100100100100100014622221 1254545 1324911 f7 U1 ?- m0 n -------------------------------- Process exited after 0.02963 seconds with return value 0 请按任意键继续. . .4 T: C7 j" w, K/ R. n/ f #字符串复制 实现逻辑,逐个赋值直到遇到'\0'停止即可 #include "stdio.h"char *sky_strcpy(char *dst, const char *str)& s' e$ b- R, |5 N; h+ ] {& E. G* P4 U7 V' q+ T if (NULL == dst || NULL == str) { return NULL; }) `1 o: W' X4 W2 l; M9 g char *ret = dst; while (*str != '\0') { *dst ++ = *str ++; }5 o& E6 P8 U' z: Y5 H4 {5 E; V1 h& r" W return ret; } / B! X9 D1 E1 t% q. o7 [ & Z* } Q* N% D' E int main(void)- r% f5 v$ L/ t5 z { char str_1[100] = "hello,world"; char str[100] ={0};3 s8 \2 g& }8 b sky_strcpy(str,str_1);$ u9 G: ~3 f$ O A& _% I printf("str_1:%s\n",str_1);3 o8 N# V* @# t( f* x printf("str:%s\n",str);! T& w: |+ \8 y/ M1 @. _ return (0); } : i% s( u" ]6 ~" F0 e3 s. P5 C 程序输出 str_1:hello,world d. A0 i% ~% b7 M: w6 L( x) \str:hello,world5 B2 B- X! U& Q% ? --------------------------------+ b2 K3 Q9 w9 R* c& R) u Process exited after 0.03334 seconds with return value 0, F6 W0 A; R9 r. I3 {/ w! W4 _ 请按任意键继续. . . #字符串比较 1、正常比较是否相同 实现逻辑,判断字符串长度是否相同,若相同逐个比较字符是否相同 #include "stdio.h"int sky_strcmp(char *dst, char *str)# ^; p6 g- H# }- F) v4 A { int i, len;$ z+ Y! @* M4 ]* k2 A7 v/ S if (NULL == dst || NULL == str) {. d# q4 B4 m& ~. }3 Y return 0;* q' J7 E" D" d# | } if (strlen(dst) != strlen(str)) { return 0;- y8 q: C- f0 \; W& V% C% w } len = strlen(dst);0 J5 K8 q5 {. M8 W4 ], g for (i = 0; i < len; i++) {; R8 o3 g2 I. |9 w if (*dst++ != *str++) { return 0; } }% z2 r" f. ` l% i; ~* b$ e( t return 1; } int main(void) { char str_1[100] = "hello,world";& V ?5 l u# D# y* ~; m char str_2[100] = "hello,world"; char str[100] = "adfs"; 4 B. c9 [+ e2 n, l! C printf("%d\n",sky_strcmp(str_1,str));7 @2 V; {4 q3 y) ^2 U) M) X2 x printf("%d\n",sky_strcmp(str_1,str_2));: c3 K6 i2 e% i8 c return (0);& a- R# [# n0 `- G# |" e } 程序输出 0, v" P5 u+ \' \1& o9 s2 |1 Y' ?; Z, Z ' [4 x% ]/ S7 P3 j( s; H -------------------------------- Process exited after 0.02802 seconds with return value 08 Q4 }/ q/ ~3 l; W 请按任意键继续. . . 2、忽略大小写字符串比较 实现逻辑,在比较字符时可以将其统一转换为大写或小写,然后再进行比对即可,和正常对比无其他不同 #include "stdio.h"( a* V9 V6 p' I( T, r" ] #define CONVERT(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) - 'A' + 'a') : (c)) int sky_strcmp(char *dst, char *str)4 [3 {$ W3 ?5 Y$ ^ { int i, len; if (NULL == dst || NULL == str) {: H4 R1 g! G) e+ h& ~0 _' m4 j3 c return 0;4 @+ _$ J/ ]* g) t6 A } if (strlen(dst) != strlen(str)) { return 0;/ n0 p* J% Z) h+ t } len = strlen(dst);. B8 M) C6 C9 V+ ?) n' g# f/ ~ for (i = 0; i < len; i++) {' Z& ~# _% S5 p$ I; x' g; X1 ? if (CONVERT(*dst) != CONVERT(*str)) {$ U* r( d& F! j; [4 } return 0; }( ]) b: C& w/ w dst ++; str ++; }: l1 y: v, u6 ^6 s1 N return 1; } int main(void) {( g2 O- x/ ?3 l. A+ i4 g% A char str_1[100] = "heLlo,world"; char str_2[100] = "hello,world";, z5 G& D& o( l4 Y char str[100] = "adfs"; 8 B @9 Q- |) G; [# ~1 Y printf("%d\n",sky_strcmp(str_1,str)); printf("%d\n",sky_strcmp(str_1,str_2));- o' A- P8 Z/ ` L- M. A return (0); } 程序输出 04 @/ I2 E8 D0 l( \6 Z+ f1 7 j2 v( z5 s0 R/ I1 l* j' F. z -------------------------------- Process exited after 0.04624 seconds with return value 0 请按任意键继续. . .+ q7 v( j5 L! t. S6 B$ W #memcpy函数实现 实现逻辑,主要就是逐个赋值即可完成 1、不考虑拷贝覆盖问题 #include "stdio.h"9 g5 [! M5 B7 C+ k& L9 Y#include "string.h"% M5 B% p5 \9 U- R( e void *sky_memecpy(void *dst, const void *str, int n) { if (NULL == dst || NULL == str || n <= 0) {: B/ V i P) i- R5 x4 n8 N: h return NULL;# D. d3 [, X) k4 @% s }( _" h+ E: `4 T6 l2 h1 q9 ?5 F char *pdst = (char *)dst;' Q) \7 J" e4 v char *pstr = (char *)str;7 o. B. l) W; @+ p while (n --) {4 f, y1 p, _2 t) E" I *pdst ++ = *pstr ++; }0 F, y- A9 P2 z/ ?( {5 I% d1 T! s return dst;6 u' B; F! c8 @: _5 F6 F* | } int main(void) {" H6 Z7 `; D' U. W8 K o char str_1[100] = "heLlo,world";0 m# [% [% V" e. Z char str_2[100] = "sdfsdfs"; sky_memecpy(str_2,str_1,strlen(str_1));( F1 }7 k# i% g3 T& F+ @ printf("%s\n",str_2); return (0);2 B) _& [- ^+ L1 X; d( X } . L2 n( J( [, q$ q; v9 ~ 程序输出 heLlo,world! H0 q- L( i5 s+ y: Q) g- ?; L: ?& ~# u' C& R9 \ --------------------------------7 n# S' r+ D p$ X( _ Process exited after 0.02516 seconds with return value 0 请按任意键继续. . .% T4 T2 r. ~! T+ z, w8 o ( o# s3 ^5 ^, ]9 z5 i! |1 T' A) q 2、考虑拷贝覆盖问题 拷贝覆盖是我们在拷贝字符串的时候需要注意的一个问题,我下面的示例程序,使用第一个函数的时候,就出现了问题,使用第二个函数就没有出现问题。 原因是,我们源字符串和目的字符串的地址都是一样的,我们希望把字符串往后移动一个位置,但是实际上出现了问题。 #include "stdio.h"#include "string.h"# S' i+ d" Z2 v& u% Z2 H void *sky_memecpy_1(void *dst, const void *str, int n) { if (NULL == dst || NULL == str || n <= 0) { return NULL;* c C/ E0 _) K9 x# p }# A( U2 b6 x7 ^3 }$ k+ B' y char *pdst = (char *)dst; char *pstr = (char *)str;7 \ \ i( H) _0 h while (n --) {. Z6 I# E- r5 T *pdst ++ = *pstr ++; } return dst;1 ] k+ W, Y/ |; O* M1 U) g1 @. } }( v: ]9 @# s! n void *sky_memecpy(void *dst, const void *str, int n)* g% w. r2 e) I- S# h e { if (NULL == dst || NULL == str || n <= 0) {4 ~/ ~9 h* ~6 r/ c7 U* R2 y return NULL;. k$ I$ n( n% g- a } char *pdst = (char *)dst;3 W1 i; ?- G0 F0 l char *pstr = (char *)str;5 ]/ _) a3 f Z( R3 R& | if (pdst > pstr && pdst < pstr + n) { pdst = pdst + n - 1; P- m% J4 }0 g% [, b0 N9 T) e pstr = pstr + n - 1; while (n --) { *pdst -- = *pstr --; }% p( L$ w7 T7 Z } else { while (n --) {. I. u! u9 {' @ t- p *pdst ++ = *pstr ++;- x/ x% u# W& q } } return dst;* \& T" G. i! I# j3 F } int main(void) {3 U7 c l: M+ f$ c char str_1[100] = "heLlo,world";- ~! C% [' e( o$ q3 w$ P char str_2[100] = "heLlo,world"; sky_memecpy_1(str_1+1,str_1,strlen(str_1)); printf("%s\n",str_1);- N) }" P$ w! v$ Y3 `4 Z8 T # M) ?" n8 W. } sky_memecpy(str_2+1,str_2,strlen(str_2));* x3 }% A) c: h7 C printf("%s\n",str_2);# R/ }1 p: l3 [, J; L/ |5 S return (0); } ( ~2 E* S' }2 ?+ T" R% V6 w 程序输出 hhhhhhhhhhhhhheLlo,world - b7 O6 e7 ~0 T, ]0 i -------------------------------- Process exited after 0.02773 seconds with return value 0 请按任意键继续. . . 针对上面的拷贝覆盖问题,单独写了一个测试程序 #include "stdio.h"#include "string.h" % ~& w# u+ u4 A8 c, J# {* ] void *sky_memecpy(void *dst, const void *str, int n); _# y5 y! _+ A& B$ O1 a: N6 M; C {$ S2 y( ~( D: E* \& `! x if (NULL == dst || NULL == str || n <= 0) {$ L6 P0 c% |$ H4 P$ E. N! y return NULL;# q7 j/ z1 L- K- q3 v. ^7 c$ w } char *pdst = (char *)dst;) {$ U6 M, L5 s0 ]* l char *pstr = (char *)str;: i0 Z: i8 I5 O' E; s/ _1 L1 X while (n --) { printf("dst:%c--->str:%c\n",*pdst,*pstr);, d! n0 {4 K9 r. r" a! t4 o1 d *pdst ++ = *pstr ++; }( k: |) h2 W4 {! F( | return dst;5 g% h0 y2 ^% ^8 R V# D } int main(void)( _ v( m9 y2 I3 w7 ~' j- X { { 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 --->str:h. r0 K5 [4 R2 [+ j. I. ?" Ldst:l--->str:h dst --->str:h8 D7 ~7 z2 G+ |+ S8 v& }dst:,--->str:h# ]0 d. ^- j: u( }! Q dst:w--->str:h dst --->str:hdst:r--->str:h M% p9 i" i7 b dst:l--->str:h dst:d--->str:h dst: --->str:h+ b4 w; W9 }' |0 f5 w0 [. l hhhhhhhhhhhh; J; ~3 Y* G' ]1 A& U) `, h }7 u0 x0 J --------------------------------9 @ {# c4 q8 B w* ?" i Process exited after 0.02575 seconds with return value 0 请按任意键继续. . . e! x# m$ ]$ g4 t# I j5 w8 w - X( f5 C" m0 L7 ]0 C0 f 初始的时候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移动,str再移动,就出现了dst被h字符所覆盖。 # {; z# |' l. l2 s |
微信公众号
手机版