怎么样把数字字符串转为数字

ImJaden 2011-03-22 11:58:58
越简单越好,像api 函数atoi怎么使用?其他方法也可以。当然那个数字字符串也是我把数字转化为字符串的的。转化为字符串用的是wsprintf,可是转化为数字弄不成功...
...全文
1107 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmaster 2011-03-26
  • 打赏
  • 举报
回复
好久没写汇编啦~~
;
;This Program Compiled Sucess by Masm 6.15
;
assume cs:code,ds:data,ss:stack
data segment
msg1 db 'Enter a digit:$'
buff db 5,0,5 dup (0)
msg2 db 'Result:$'
data ends
stack segment stack
db 64 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax

mov dx,offset msg1
mov ah,9
int 21h
mov dx,offset buff
mov ah,10
int 21h

mov bx,offset buff+2
mov ax,0
mov cl,[bx-1]
s: mov dx,10
mul dx
and byte ptr [bx],0fh
add al,[bx]
adc ah,0
inc bx
loop s

call crlf
mov dx,ax
call disp

mov ah,4ch
int 21h
;
crlf proc uses ax dx
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
ret
crlf endp
disp proc uses dx
mov cx,4
d0: push cx
mov cl,4
rol dx,cl
push dx
and dx,0fh
cmp dl,10
jb d1
add dl,37h
mov ah,2
int 21h
jmp jx
d1: add dl,30h
mov ah,2
int 21h
jx: pop dx
pop cx
loop d0
ret
disp endp
;
code ends
end start
shzhfu 2011-03-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 polytechnic 的回复:]
不好意思,没看到这是汇编版
2楼的思路正确,但是效率不高
因为数字都是按2进制存储的,ascii码是16进制存储的,所以用16进制效率最高

假设字符串在esi当中,读取的数字放在edx当中

xor edx,edx
start:
lodsb
test eax,eax
jz finish
sub al, 0x30
shl edx, 8
or dl, al
jmp sta……
[/Quote]

这段程序没有实现楼主的意图吧,结果应该是“把数字字符串变成了4位BCD码”,比如输入‘65535’,转化的结果好像是05050305H,而不是0FFFFH(=65535).
lxyalx 2011-03-26
  • 打赏
  • 举报
回复
这个的却不错
polytechnic 2011-03-26
  • 打赏
  • 举报
回复
不好意思,没看到这是汇编版
2楼的思路正确,但是效率不高
因为数字都是按2进制存储的,ascii码是16进制存储的,所以用16进制效率最高

假设字符串在esi当中,读取的数字放在edx当中

xor edx,edx
start:
lodsb
test eax,eax
jz finish
sub al, 0x30
shl edx, 8
or dl, al
jmp start
finish:
polytechnic 2011-03-26
  • 打赏
  • 举报
回复
最后写错一个,应该是_stscanf(_T("%d"), &i);
polytechnic 2011-03-26
  • 打赏
  • 举报
回复
有2种方法

1.atoi()
char s[]="12345";
int i=atoi(s);

2.sscanf()
char s[]="12345";
int i;
sscanf("%d", &i);

以上针对ansi
如果要兼容ansi和unicode,用下面的:

1._tstoi()
TCHAR s[]=_T("12345");
int i=_tstoi(s);

2._stscanf()
TCHAR s[]=_T("12345");
int i;
_stscanf("%d", &i);

带下划线的函数表示是VS的库函数,在别的编译器中不一定能用
G_Spider 2011-03-26
  • 打赏
  • 举报
回复
以前写的个东西,原理类似。
将串" 94, 129, 144, 179" 分离成四个数值型数据(保存到RECT结构中)。
;====================================
;ml /c /coff ustr2dw4.asm
;link /subsystem:windows ustr2dw4.obj
;====================================
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include masm32.inc

includelib kernel32.lib
includelib user32.lib
includelib masm32.lib

.data

;测试数据,将如下串szdw4转成RECT格式的值
szdw4 db " 49 , 129 ,144, 179 ",0
fmt db "%d-%d-%d-%d",0dh,0ah,0 ;//显示分离后的数值数据
sztitle db "Test",0

.data?
buf db 24 dup(?)
dwdata RECT <?>

.code
;#########################################################################
;
; ustr2dw4 - G-Spider 2010
;
; Parameters
; pszString - null-terminated string to be converted
; for example " 94 , 129 , 144, 179 ",0
; pRECT - >RECT struct
; Result
; RECT <= converted number
;
;#########################################################################

ustr2dw4 proc pszString:DWORD,pRECT:DWORD
mov edi,pRECT
assume edi:ptr RECT

mov esi, [pszString]
xor ebx, ebx
@@next:
xor edx, edx
xor eax, eax
jmp @@chkz
@@redo:
sub dl, "0"
mov ecx, eax
add eax, eax
shl ecx, 3
inc esi
add eax, ecx
add eax, edx
@@chkz:
@@:
mov dl, [esi]
inc esi
cmp dl, " "
je @B
dec esi
cmp ebx,3
je @@bottom

cmp dl,","
jne @@redo
inc esi
inc ebx
cmp ebx,2
jl @@left
je @@top
jmp @@right

@@left:
mov [edi].left,eax
jmp @@next

@@top:
mov [edi].top,eax
jmp @@next

@@right:
mov [edi].right,eax
jmp @@next

@@bottom:
test dl,dl
jne @@redo
mov [edi].bottom,eax

assume edi:nothing
xor eax,eax
ret

ustr2dw4 endp

;#########################################################################
start:
invoke ustr2dw4,offset szdw4,offset dwdata
invoke wsprintf,offset buf,offset fmt,\
dwdata.left,dwdata.top,dwdata.right,dwdata.bottom
invoke MessageBox,NULL,offset buf,offset sztitle,0

invoke ExitProcess,0

end start
masmaster 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 znxllyuan 的回复:]
2L正解
[/Quote]
是1L
znxllyuan 2011-03-23
  • 打赏
  • 举报
回复
2L正解
ImJaden 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shzhfu 的回复:]
按字节转化成一位一位的数字,然后加权(10^n)合并。
[/Quote]
能不能举个简单的例子呀?我是初学者
va_zaixuexi 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 masmaster 的回复:]
楼上正解!
[/Quote]
相当同意!!
masmaster 2011-03-23
  • 打赏
  • 举报
回复
楼上正解!
shzhfu 2011-03-23
  • 打赏
  • 举报
回复
按字节转化成一位一位的数字,然后加权(10^n)合并。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧