2014-01-10 2 views
0

Как сделать обработку обратного пространства для строки в 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

Но если ЬиЕ имеют более 1 Bs, пример

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

Выход будет = DeBsate

Функция найдет только 1 обратное пространство. Зачем? Поскольку j увеличиваются после обработки первых Bs и игнорируются, проверяя Bs после этого. Конечно, если проверка на терминале, выход - это дата. Но если я запишу отладку только для того, чтобы увидеть строку внутри buf. Второй Bs все равно будет там. Это не так. Как изменить эту функцию?

+0

Ответ в вопросе. –

+1

C имеет escape-последовательность для backspace - '\ b' - почему вы пытаетесь сделать это вручную? – Graeme

+0

Рома-МТ: Я не получаю ваш комент. Не возражаешь, чтобы немного его обработать? –

ответ

4

Вы можете обработать строку для обработки забоя с помощью следующего кода (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. 
+0

Это помогает. Большое спасибо. Любопытно, можно ли просто использовать один указатель как dest и играть с xyzzy в качестве источника? –

+1

@MohdFikrie: возможно, но вам нужно знать, когда вы находитесь в начале строки, чтобы не отступать от нее. Для этого вам понадобится дополнительная информация. – paxdiablo

2

ли эти строки внутри else:

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

Да, я забыл про 'j'. Увеличение j должно быть перемещено в ветку 'else'. – VladimirM

Смежные вопросы