gpt4 book ai didi

c - 如何在 C 中进行退格处理

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:15 24 4
gpt4 key购买 nike

如何在C中对字符串进行退格处理?这是我写的一个简单的例子

char buf[1024]="D,e,Bs,a,t,e"  \\*Bs means Backspace
char tmp[1024];
int j,n;
n=0;

sprintf(tmp,"%s",buf);
for(j=0;tmp[j] !='\0';j++)
{
if ((tmp[j] == '\x08') || (tmp[j] == 127))
{
j++;
n--;
}
buf[n] = tmp[j];
n++;
}
buf[n] = '\0';
printf("%s",buf);

这将打印 = Date

但是如果 buf 有超过 1 个 B,例如

char buf[1024] = "D,e,e,Bs,Bs,a,t,e"

输出将是 = DeBsate

该函数只会找到 1 个退格键。为什么?因为 j 在它处理完第一个 Bs 之后增加了,而忽略了之后的 Bs 检查。当然,如果在终端上检查,输出仍然是日期。但是,如果我记录调试只是为了查看 buf 中的字符串。第二个 B 仍将存在。这不是应该的。如何修改此功能?

最佳答案

您可以使用以下代码处理字符串以处理退格(includemain() 用于调试目的,processString() 函数是这个解决方案的“核心”):

#include <stdio.h>

void processString (char *str) {
// Set up independent source and dest pointers.

char *src, *dst;

for (src = dst = str; *src != '\0'; src++) {
// Backspaces handled specially.

if (*src == '\b') {
// BS will back up unless you're at string start.

if (dst != str) {
dst--;
}
continue;
}

// Non-BS means simply transfer character as is.

*dst++ = *src;
}

// Terminate string.

*dst = '\0';
}

int main (void) {
char xyzzy[] = "\bPaxDiablo\b\b\b\b\b\b is one mighty fine gal\b\buy.";
processString (xyzzy);
puts (xyzzy);
return 0;
}

逻辑是简单地在字符串中运行两个独立的指针,一个是您读取的指针,另一个是您写入的指针。前者每次循环递增 1。

除非您按下退格键,否则第二个也会执行此操作。如果是这样,它将丢弃该字符并递减目标指针(仅当您不在字符串的开头时)以便在下一次迭代中覆盖前一个字符(如果它是最后一个字符则在循环之后) .

正如预期的那样,输出是:

Pax is one mighty fine guy.

关于c - 如何在 C 中进行退格处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21034365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com