有一个首地址为string的字符串 ,剔除string中所有的空格字符。
要求:请从字符串最后一个字符开始逐个向前判断、并进行处理。
算法思想:
假设
串以0作为结束标志,从右向左扫描,遇到空格后,将其后的所有字符向前移动一个位置,直到首字符为止。 由于串长是动态变化的,所以需要设置三个指针,tailP指向串尾, 扫描用的指针scanP, 及移动时用的指针moveP。
算法描述:
1. scanP=tailP=sLen-2;
2. while (scanP>=0) do
if sStr[scanP]==' ' then
{ for moveP=scanP+1 to tailP do
sStr[moveP-1]=sStr[moveP];
tailP--; }
else
scanP++;
3. print sStr;
2. while (scanP>=0) do
if sStr[scanP]==' ' then
{ for moveP=scanP+1 to tailP do
sStr[moveP-1]=sStr[moveP];
tailP--; }
else
scanP++;
3. print sStr;
代码实现:
.data
sStr db 'ae f d g',0 ;定义一个含空格的字符串
sLen equ $-sStr ;获取字符串长度
output byte 'result: %s',10,0
tailP dword ?
scanP dword ?
moveP dword ?
.code
main proc
mov scanP,sLen-2
mov tailP,sLen-2
mov ecx,sLen-1 ;判断次数
mov edi,tailP ;串尾指针
mov esi,scanP ;扫描指针
mov ebx,moveP ;移动指针
mov edx,sLen-1
again:
cmp sStr[esi],20h ;比较当前字符是否为空格
jne left
push esi ;若当前字符为空格,先将当前扫描位置压入栈保存起来
add esi,1
mov ebx,esi ;移动指针指向空格后面的元素
pop esi ;esi弹出,即扫描指针恢复到空格位置
L1:
cmp ebx,edx ;判断移动指针的位置超出字符串结束符
ja next ;若超出,跳转;否则将后续元素前移一位
mov al,sStr[ebx]
mov sStr[ebx-1],al
inc ebx ;移动指针右移一位
jmp L1
next:
dec edi ;串尾指针前移
jmp L2
left:
cmp esi,0 ;若当前字符不是空格,判断是否扫描到首字符
jz done
dec esi ;未扫描到首字符则将扫描指针前移一位
L2:
loop again
done:
pushad
invoke printf,offset output,offset sStr
popad
ret
main endp
end main
运行结果:
aefdg
实验过程中的问题:
刚开始去除空格后进行移位时没有将
字符串的串尾结束符考虑在内,导致输出字符串长度与原来的一样。
必须将字符串的串尾结束符一起前移才能输出正确的字符串。