簡體   English   中英

如何在C中進行退格處理

[英]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將仍然在那里。 這不是應該的。 如何修改此功能?

您可以使用以下代碼處理字符串以處理退格(其中的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;
}

邏輯是簡單地通過字符串運行兩個獨立的指針,一個是您從中讀取的指針,另一個是您向其中寫入的指針。 通過循環,前者每次加一。

除非您輸入退格字符,否則第二個代碼也會這樣做。 如果是這樣,它將丟棄該字符並減小目標指針(僅當您不在字符串開頭時),以便在下一次迭代時覆蓋前一個字符(如果是最后一個字符,則在循環之后) 。

如預期的那樣,輸出為:

Pax is one mighty fine guy.

else做這些行:

buf[n] = tmp[j];
n++;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM