2015-02-19 4 views
0

Предположим, у меня есть строка, которая может выглядеть примерно так:Выборочное удаление определенного полукокса в строке

"value" "some other value" "other value" "some value"  

Моя цель состоит в том, чтобы удалить заготовки выборочно, например, так:

"value""some other value""other value""some value" 

такие что заготовки остаются только внутри строки, содержащиеся в кавычках:

"some other value" 

У меня есть следующие функции:

void rmChar(char *str, char c) 
{ 
char *src, *dest; 
src = dest = str; 

while(*src != '\0') 
{ 
    if (*src != c) 
    { 
     *dest = *src; 
     dest++;   
    } 
    src++;   
} 
*dest = '\0';   
} 

, который удаляет все вхождения нагара гр в ул и я, хотя я должен использовать некоторые более условные выражения, чтобы сделать удаление только тогда, когда некоторые вещи случаются.

У вас есть ключи?

ответ

1

Я просто подумал об этом. Ниже моя программа.

Примечание: Это не может быть эффективная программа (сложность или сложность пространства), однако она делает то, что вы пытаетесь сделать (если я правильно понял ваш вопрос).

Примечание Также я использовал malloc() в этом коде. Вы не использовали бы его, если бы вы меняли содержимое исходной строки без использования какой-либо другой строки. Но, как я понял из вашего вопроса, вы делали новую строку, содержащую значение исходной строки после удаления пробелов.

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

void rmChar(char *,char, int); 
int main() 
{ 
    char string[200] = "\"This is a value\" \"and another value\" \"value2 this\""; 
    char c; 
    c = '"'; 
    printf("%s\n",string); 
    int len = strlen(string); 
    /*Pass the address of the stringi, char c, and the length of the string*/ 
    /*Length of the string will be required for malloc() inside function rmChar()*/ 
    rmChar(string, c, len); 

    return 0; 
} 

void rmChar(char *str,char c, int len) 
{ 
    char *dest1, *dest2; 
    char *src = str; 

    int removeFlag = 0; /* You will remove all the spaces ' ' that come after removeFlag is odd*/ 

    dest1 = malloc(len); 
    dest2 = dest1; 

    while(*str != '\0') 
    { 
      if(*str == c) 
      { 
        removeFlag++; 
        if (removeFlag %2 == 0) 
        { 
          /* This is required because every 2nd time you get a " removeFlag is increased so next if is NOT true*/ 
          *dest2 = *str; 
          dest2++; 
        } 
      } 
      if ((removeFlag % 2) == 1) 
      { 
        *dest2 = *str; 
        dest2++; 
      } 
      str++; 
    } 
    *dest2 = '\0'; 
    printf("%s\n", dest1); 
    /* If you want to copy the string without spaces to the original string uncomment below line*/ 

    //strcpy(src, dest1); 

    free(dest1); 
} 

Вам нужно еще одну переменную, чтобы использовать как своего рода флаг в котором указывается, после чего "необходимо удалить пробелы. Тогда вы будете использовать этот флаг в if() утверждение в некотором роде. Вот int removeFlag это флаг I

+0

Спасибо, хороший сэр! Мне удалось это сделать, используя проверку на четность (как и вы) и еще несколько тестов (для более сложных строк). – Alex

+1

@AlexandruDinu Рад, что это помогло. Да, и я догадываюсь есть много способов сделать это. Хорошо, если вы исследуете все из них, чтобы вы могли использовать лучший способ (который использует наименьшие переменные или наименьшую строку кода). – sps

1

Цикл, который выполняет итерацию по строке, должен отслеживать, если он в настоящее время ищет символ внутри строки с кавычками или нет, а затем использовать эту информацию для удаления только при необходимости.

Чтобы отслеживать эту информацию, вы можете использовать дополнительную переменную, которая обновляется каждый раз, когда есть ".

int quoted = 0; 

while (...) { 
    if (*src == '"') { 
    // set `quoted` to 1 or 0, as appropriate 
    ... 
    } 

    // delete only if !quoted 
    ... 
} 
Смежные вопросы