2016-07-31 4 views
-2

Это может быть основной, пожалуйста, будьте терпеливы со мной,Удаление символов из исходной строки?

char data[]="(xxx)"; 

Я хотел бы удалить() и оставить данные только быть xxx,

char *p = strtok(data,"("); 
p = strtok(NULL,")"); 
printf("this data: %s \n",p); 
printf("this data: %s \n",data); 
  1. р должно быть xxx, но его NULL, данные остаются неизменными (strtok должен влиять на источник?)
  2. это не изменит данные, я хотел бы, чтобы управлять данными было xxx
+1

Как насчет '' a (xxx) b "'? – a3f

+0

Не совсем понятно, что вы просите –

+0

@layzak возьмите любое слово с() и просто удалите() из исходного слова. – Curnelious

ответ

1
char *in_parens(char* str) { 
    char *end, *start; 
    if (!(end = strrchr(str, ')'))) return NULL; 
    if (!(start = strchr(str, '('))) return NULL; 
    *end = '\0'; 
    return start + 1; 
} 

int main(void) { 
    char data[] = "a(x(b)x)c"; 
    printf("%s\n", in_parens(data)); // prints x(b)x 
} 

NULL Возвращает, если строка не содержит () пары. В противном случае, удаляет внешнюю пару и возвращает то, что внутри.

+0

отлично, что мне нужно, поэтому просто позвоните и передайте данные? как я могу сменить исходный массив данных? – Curnelious

+0

Да, но имейте в виду, что 'str' изменен. – a3f

+0

Я не уверен, как использовать это для изменения данных. – Curnelious

3

Как насчет

memmove(data, data + 1, sizeof data - 1); // Removes the (
data[strlen(data) -1] = '\0'; // Removes the) 

Обратите внимание, что выше решение работает только на данных, первоначально представленные, с передними и задними скобками. Он также работает только в том случае, если data фактически является массивом, а не указателем. И массив data должен находиться в изменяемой памяти (например, ОЗУ).

Также обратите внимание, что требования, изложенные в параграфе, выполнены, то порядок этих двух утверждений не имеет значения.

+0

Элегантное решение –

+0

Что относительно 'a (xxx) b'? a3f упоминается не элегантно, но приемлемо – snr

+0

Спасибо Я не могу использовать memmove его микропроцессорную среду, любую другую опцию? – Curnelious

1

Это символ [], а не строка. Вы можете попробовать что-то вроде этого:

char new_Data[sizeof(data)/sizeof(char)]; 
for(i=1 ; i < sizeof(new_Data) ; i++){ 
     new_Data[i] = data[i]; 
} 

Это может работать только тогда, когда «(» и «)» находятся в конце вашего полукокса *

+0

«Это символ *, а не строка». 1) ОП никогда не упоминал ни об одном из них, так о чем вы говорите? 2) Это не 'char *', это 'char []'. Огромная разница. –

+0

Извините. Я просто редактирую свой пост –

+0

спасибо, это не отвечает на мой вопрос, его новый var, а также почему strtok не влияет на данные? – Curnelious

-1

код занимает две строки, которые первый полный один , другой - какие символы должны быть удалены. Вы можете указать как ()qwer.

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

char *strip_chars(const char *string, const char *chars) 
{ 
    char * newstr = malloc(strlen(string) + 1); 
    int counter = 0; 

    for (; *string; string++) { 
     if (!strchr(chars, *string)) { 
      newstr[ counter ] = *string; 
      ++counter; 
     } 
    } 

    newstr[counter] = 0; 
    return newstr; 
} 

int main() 
{ 
    char *new = strip_chars("(xxx)", "()"); 
    printf("%s\n", new); 

    free(new); 
    return 0; 
} 
0

Ваш код не будет работать, потому что strtok не работает так, как вы думаете. При вызове в первый раз, как это:

char *p = strtok(data,"("); 

Он будет:

  1. пропустить до первого символа, это не разделителем.
  2. затем попытайтесь найти следующий разделитель.
  3. заменить последним разделителем с \0.
  4. вернуть указатель на первый символ токена.

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

Вы можете изменить это, добавив окончание разделитель в первом вызове, как это:

char *p = strtok(data,"()"); 

Теперь strtok найти маркер и возвращает указатель на первый x в вашем примере. Заметьте, однако, что, поскольку он только заменил ограничивающий ограничитель на \0, начальный родитель все еще присутствует в data.

Чтобы избавиться от этого, который вы могли бы сделать что-то вроде этого:

char *p = strtok(data,"()"); 
strcpy(data, p); 

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

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