Удалить текст в скобках из строки? - PullRequest
0 голосов
/ 18 апреля 2019

Моя задача - найти и удалить текст в скобках из строки. Моя идея состоит в том, чтобы посчитать позицию первого '(' и последнего ')', а затем удалить d символов из '(' позиция, проблема в том, что позиция '(' и ')' заменяется на 0, если что-то действительно есть в круглые скобки.


void task(char *s)
{
    int i,d;
    int j=0;  //position of first '('
    int k=0; //add 1 for every character in parentheses until reach ')'
    for(i=0; i<strlen(s); i++)
    {   
        if(s[i]=='(')
        {
        j=i;
        }
            else{
            if(s[i]==')') 
            k=i;
            printf("k=%d \n",k);
            }

    }
    d=(k-j-1);
}
void deleteptext(char *x,int a, int b)
{
    if((a+b-1)<=strlen(x))
    {
        strcpy(&x[b-1],&x[a+b-1]);
        puts(x);
    }
}
int main()
{
    puts("Text: ");
    gets(s);
    task(s);
    deleteptext(s,j,d);
}   

Например, если мой ввод abc (def), вывод такой же (нужно abc), значение 'j' в одной точке равно 4, но оно возвращается к 0, так как встречается с "d".

1 Ответ

1 голос
/ 18 апреля 2019

Ваша программа не компилируется, вы предполагаете, что можете получить доступ к main локальной переменной j из task , d неизвестно и т. д., и вы используете strcpy , тогда как источник и назначение могут перекрываться и устареть получает

Предложение с использованием strchr , strrchr и memmove :

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

int main()
{
  puts("Text : ");

  char s[256];

  if (fgets(s, sizeof(s), stdin) == NULL)
    return -1;

  /* may be remove \n from s */

  char * p1 = strchr(s, '(');

  if (p1 == NULL)
    fprintf(stderr, "'(' is missing\n");
  else {
    char * p2 = strrchr(p1+1, ')');

    if (p2 == NULL)
      fprintf(stderr, "')' is missing\n");
    else {
      memmove(p1, p2 + 1, strlen(p2 + 1) + 1);
      puts(s);
    }
  }

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra p.c
pi@raspberrypi:/tmp $ ./a.out
Text : 
aze(qsd)wxc
azewxc

Обратите внимание, что все между первым '(' и последним ')' удаляется, даже если существует более одного '(' или ')':

pi@raspberrypi:/tmp $ ./a.out
Text : 
aze((qsd)wxc
azewxc

pi@raspberrypi:/tmp $ ./a.out
Text : 
aze(qsd)iop)wxc
azewxc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...