• XSS.stack #1 – первый литературный журнал от юзеров форума

Убрать из строки символы %

Может поможет кто со следующим:
имеемтся массив char *, содержащие слова (например a[1] - это слово "%2Погода", а a[4] - "%12%%Минск%")
требуется избавиться от символов % в словах, а если за ними следует цифра, то и от этой самой цифры тоже избавиться

В с++ новичёк, с парсингом слов никогда не работал, работавю в ВС 7,1 (2003), помогите... :baby:
 
C.H.A.D.o

Посимвольно обрабатываешь каждое слово массива, вырезаешь все % и копируешь в выходной массив слов. Что-то вроде такого:

Код:
char* words[100];
char* out[100];

for(int i=0;i<100;i++)
{
  if(words[i]==NULL)
  {
    out[i]=NULL;
    break;
  }
  for(int k=0;k<strlen(words[i];k++)
  {
    if(words[i][k]=='%')
    {
      k++;
      if(is_digit(words[i][k+1]))
        k++;
    }
    else
      out[i][k]=words[i][k];
    }
    out[i][k]='\0';
  }
}

Не тестил, так что ошибки не исключены. Но алгоритм такого плана как я привел.
Предполагается, что после последнего слова идет элемент со значением указателя NULL и после % в словах идет не более 1 цифры. Для приведенных тобой примеров результат должен быть, соотв., "Погода" и "2Минск"
Добавлено в [time]1136741436[/time]
А вообще, если у тебя так туго с парсингом строк, советую изучить мой самопальный аналог printf():

Код:
int putstr(char* str)
{
	for(unsigned int i=0;i<strlen(str);i++)
  putchar(str[i]);
	return 0;
}

void strtoupper(char* str)
{
	char sub='A'-'a';
	for(unsigned int i=0;i<strlen(str);i++)
	{
  if(str[i]>='a' && str[i]<='z')
  	str[i]+=sub;
	}
}

int my_printf(char* msg, ...)
{
	char* str;
	int num;
	char buf[100];

	va_list ap;
	va_start(ap, msg);
	for(unsigned int i=0;i<strlen(msg);i++)
	{
  if(msg[i]=='%')
  {
  	i++;
  	if(msg[i]=='%')
  	{
    putchar('%');
    continue;
  	}
  	switch(msg[i])
  	{
  	case 's':
    str=va_arg(ap, char*);
    putstr(str);
    break;
  	case 'd':
    num=va_arg(ap, int);
    itoa(num, buf, 10);
    putstr(buf);
    break;
  	case 'x':
    num=va_arg(ap, int);
    itoa(num, buf, 16);
    putstr(buf);
    break;
  	case 'X':
    num=va_arg(ap, int);
    itoa(num, buf, 16);
    strtoupper(buf);
    putstr(buf);
    break;
  	default:
    putchar('%');
    putchar(msg[i]);
  	}
  }
  else putchar(msg[i]);
	}
	va_end(ap);
	return 0;
}
	

int main()
{
	char buf[20];
	my_printf("String: '%s', number: '%d', hex: '%x', bighex: '%X', percent: '%', '%%', illegal modifier: '%f'\n", "C++", 4, 65535, 255);
	return 0;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх