使用Jeb在ss64 上发布的技巧将退格控制字符保存到变量中 - 当“重叠”退格时,我得到了奇怪的结果。
该示例位于此处发布的代码高尔夫挑战中:Backhanded^H^H^H^H^H^Hspaces(希望有任何缩短此代码的提示)。
Ungolfed 它可能看起来像这样:
@echo off
setLocal enableDelayedExpansion
for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a
set s=%1
echo %s:^H=!DEL!%
Run Code Online (Sandbox Code Playgroud)
基本上,它使用 Jeb 的技巧将退格键保存为变量,然后使用字符串操作^H将输入字符串中的所有实例替换为该变量。这适用于以下示例和类似的输入:
C:\>bsp.bat "testing^H^H^H test"
"test test"
Run Code Online (Sandbox Code Playgroud)
但是,当发生“重叠”使用^H时,我得到以下令人困惑的(对我而言)输出:
C:\>bsp.bat "AAA^HB^H^H"
"A"B
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 在上面的例子中,为什么我收到这个输出而不是预期的"A"?
我不明白为什么“预期输出”应该是“A”。请参阅此逐字符输出:
bsp.bat "AAA^HB^H^H"
"
"A
"AA
"AAA
"AAA <- backspace, the cursor is over last "A"
"AAB
"AAB <- backspace, the cursor is over last "B"
"AAB <- backspace, the cursor is over second "A"
"A"B
Run Code Online (Sandbox Code Playgroud)
BS 字符只是将光标向后移动一个字符。BackSpace 键(也称为“BackSpace echo”)的“标准行为”是“BackSpace+space+BackSpace”。
顺便说一句,这是我用来获得BS角色的方法:
for /F %%a in ('echo prompt $H ^| cmd') do set BS=%%a
Run Code Online (Sandbox Code Playgroud)