找回密码
 注册
关于网站域名变更的通知
查看: 94|回复: 0
打印 上一主题 下一主题

字符串和整数转换的C实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-3-29 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
即将就业,也复习复习相关的知识,看了看嵌入式C的笔试题,整体感觉考试题目还是蛮有意思的,考点都比较重要,而且比较细,主要还是设计到一些指针和数组已经函数指针等基本的概念。
比如:% {" ]. c) Q( o6 }" @) C
如何实现两个值中的最大值:((a+b) + abs(a-b))/2; ]9 ^5 t; b7 B* P) f. T8 o
如何实现不依靠中间量实现两个变量值的交换:
1 H1 r* [5 t7 @  ra = a + b;
1 U+ q! ?* u$ x; J' S1 eb = a - b;8 a5 m& b1 J/ B. O  o
a = a - b;8 I: G9 F% U2 E" I8 N
或者
+ `' N) x' z5 v& t9 p5 a& |3 g; L8 l4 ba = a^b;0 [6 v  r2 b& y% B
b = a^b;7 l& l* E9 ^) S
a = a^b;9 N3 w$ L1 x& _2 Q+ o$ I. K
其中后面的这种方式更加的优越。5 o1 b) t1 A2 Y3 b( W- k
# V* n* |. u) U" v
sizeof与strlen的区别
% w/ ?7 d/ t+ A9 E/ u  _* c7 E其中sizeof是一个操作符,在编译过程中就能确定结果,但是strlen是一个函数,只有在运行的时候才能得到返回值。7 W1 y3 [! L6 j9 k  {2 }

4 o4 l6 z  B3 W7 a: s指针、数组、函数等各种形式的指针结合起来也是出题的重点。
& H% M* L1 P* o& [1 A; @0 g7 _7 @, {3 b4 j5 k
在编程中主要是设计到字符串、链表的处理问题,我就找几个简单的程序当做练兵吧。实现整数和字符串之间的转换问题。这个转换问题实质上是处理好ASCII码与数字之间的切换关系,即数字的ASCII码形式为‘0’= 0 + 48; ‘9’= 9 + 48;0 = 0-48。& R: |! L! b$ q  _/ M
这个关系是转换过程中最主要的问题,当然整数到字符串的转换过程中需要注意负数的影响,如果负数没有正确处理,就可能出现一些莫名其妙的结果。1 V; B# R" P: M) Q2 T  ~# z; z

! B  F/ Y: T4 B1 Q2 Q9 _首先实现字符串到整数的转换过程:这个过程相对来说比较容易,因为这个过程可直接判断是正数还是负数,直接判断下标0对应的内容即可,其他的可以通过逐步求和累加的形式实现。基本的转换过程如下:
int myatoi(char *src)
" S2 ]! D  Z5 N) j3 y{
( k# N) }* z; G9 pchar flag = 0;
5 M  n+ G; P& M% l7 Yint sum = 0;
9 h9 c! u& A$ B9 Lint i = 0;, `" H$ u, D* j) B
int len = strlen(src);
) m: e# r! J( T: A  p3 j9 W) @* a* Y& T
/*参数的正确性*/
6 G0 K/ `: p# N5 eif(NULL == src)7 Y+ f, V% l" `4 T& K6 K( h1 I
{2 E1 \3 m) v% Z% Q! r$ D
return 0;
2 p8 e4 Q. b& X3 ^, Q" M}8 y  i4 V* k1 |! r* ^; T& C
( i& Y  E/ }5 ], \/ R1 t" d
/*是否存在符号问题*/
' @* Q  C* @2 T3 D- s  V7 Eif(src == -)
! b* i6 Z% E" F( T$ e{
5 c7 C" M5 q2 kflag = -;' e) H* H2 M& U( l) q3 U% p
++ i ;
9 ^& r! W+ Y- t8 p6 Y}
for( ; i < len ; ++ i)
- m& X0 m  X+ g{
- }/ N, g2 ?. o" p/ Y+ J- ^% z/*判断字符是否合法*/" [6 F6 C% j# n! j" r! y- N
if(src < 48 && src > 57)4 w7 R: j. H; T: `9 W7 e+ T
return 0;
  _1 _% w) O+ @+ V  W  ~
2 V& Q- S' \3 |/*数据求和,注意数值的转换问题src - 48*/3 J0 ]3 l9 L- _  F
sum = sum *10 + src - 48;
% J. w' P5 j- N1 n, U* z}' O5 n" w% K8 U; l: E! b

* s9 u9 ?/ S: z. ^0 [/*根据标志位实现返回正确的正负数*/- ?9 ]$ l4 t% Z" E
if(flag == -)
+ ~9 W! {1 a2 P6 F7 ?! ?return -sum;, e( ?3 x1 W* ~/ Q" \
else: x9 H3 E! a. o" `3 I+ r1 |* W( U
return sum;) P1 c% i* I/ Y: f3 d
}
整数到字符串的转换:实际上就是将一个整数的各个位分离出来,然后实现字符串的排序问题,因为数字长度的不确定性使得不便于快速的确定字符串的长度,只能首先分解,然后排序。同时也需要注意符号的存在,基本的转换过程如下:

9 @+ _/ v9 \1 U, |/ x$ z6 v
char* myitoa(int num, char *str)
- ~" R3 r% S" t{$ e- U  e' t  t
char flag = 0;# v% A: E9 s" B6 Y" O& q. D+ ]
int i = 0, count = 0, j = 0;
/*参数检测*/
  T/ P, F$ R' ?5 M, n% Mif(NULL == str); w# T, ~/ P1 ]' u2 y' w# F/ h0 |
{% T; N; L; M5 H4 f, F/ F& ^
return NULL;7 X6 H& M( I* y2 ^; q
}
' F( a  x0 Q' c: k" K( @* ~. j& z9 K, K
/*判断数值的正负,设置对应的符号*/6 t/ Q/ v% A; W
if(num < 0)2 ~9 f% d* a# r
{0 Q6 Y: G# y; H& F
str[i ++] = -;
/************************
2 _( g/ y) v1 c/ P  W* I同时要对数值取绝对值! k; _7 L' F2 f: M8 L+ x8 b. z
保证后面取余整除操作正常
$ c/ y4 R2 o4 x& V1 S3 i*************************/
# v; V# c% x  Cnum = -num;* H7 r! S( L- L; S7 r$ C2 P4 g& B
}, H% ]# [9 T* `/ u
' y% S- X$ h+ C; S
while(num / 10)4 \; |% d& L& E  s* F
{; b8 \' S9 u* y* S* z9 h" \' c" T
/***************************1 y' O9 c& Z8 o7 ]% Q0 f
count用来保存实际的数字个数,9 q+ n8 i" }: M
便于后期的顺序调换8 A- b$ _# f$ H) b, k2 g4 u) Q
****************************/% N3 \! u) ^- M/ A6 I0 s" U
++ count;
6 t3 `% e3 A3 U9 A# e0 E' E* ?/*实际保存的顺序为反序列*/" Y# e4 Y& ]" x) W% K; _: E& c3 o, P( L
str[i++] = num % 10 + 48;
7 K: A/ T( M9 Y4 ^/ X+ Pnum /= 10;8 @* C$ |- n: I- i1 G! V
}( S% s7 y9 p  i/ C9 D
/*判断是*/* }2 z. D3 X" i. f2 w7 A* d
if(num %10)
4 U# d  b2 s1 ~; _3 C' Z{6 Q) m% ?9 c  }5 D5 B- V0 ]! P
str[i++] = num %10 + 48;2 `% [3 o. E& z* D  O2 c1 i
++ count;
0 C9 @! T" ^% `3 a' x% i$ n4 [" a}
, r5 C, V4 z* e/*字符串结束符*/
/ X/ A: M# F: ]str = 0;! u. |: o2 H& ?8 E7 Z

6 Y+ e  p9 e* [/*实现数据的较好操作*/2 s6 k  r! f5 X4 N0 n3 }
i = 0;
+ O7 Q. l' n5 ?7 K& U/ }2 m2 V) z& hif(str[0] == -)9 H7 l+ G9 R3 K. T
{
: h! S7 j# x# ti = 1;
9 ^- }/ A9 M) A# B& L' K! n5 c5 X}8 ?$ X$ Y5 m5 O" ^: o# y, u
/*实际交换的下标区间为i~j*/6 W' ], y* i2 d
j = count + i - 1;
for(; i < j ; ++ i, --j)! n+ g! N( ?  O: }7 d" M( i
{1 y+ l. v0 l7 z, W0 B; |1 s
/*数据的较好操作*/
( a7 [5 q9 ^8 X) [str = str + str[j];
: Q' w7 ]& E' \8 K% bstr[j] = str - str[j];! v8 i5 {$ L- q
str = str - str[j];
9 ]0 L, w$ i3 R  t, {8 t}
/*返回实际的字符串*/
$ a9 G: R  M( S+ G% ?return str;
0 M0 h  F& B5 o3 L6 j) b7 \}
上面的代码就实现了字符串与整数的转换问题,基本上实现了各种情况的转换。

" @* d( w5 u, v
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 04:58 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表