[英]How to do backspace processing in C
如何在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在處理完第一個B之后增加了,之后忽略了檢查B。 當然,如果在終端上檢查,輸出仍然是日期。 但是,如果我登錄調試只是為了查看buf中的字符串。 第二個B將仍然在那里。 這不是應該的。 如何修改此功能?
您可以使用以下代碼處理字符串以處理退格(其中的include
和main()
用於調試目的, 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;
}
邏輯是簡單地通過字符串運行兩個獨立的指針,一個是您從中讀取的指針,另一個是您向其中寫入的指針。 通過循環,前者每次加一。
除非您輸入退格字符,否則第二個代碼也會這樣做。 如果是這樣,它將丟棄該字符並減小目標指針(僅當您不在字符串開頭時),以便在下一次迭代時覆蓋前一個字符(如果是最后一個字符,則在循環之后) 。
如預期的那樣,輸出為:
Pax is one mighty fine guy.
在else
做這些行:
buf[n] = tmp[j];
n++;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.