Как напечатать (код C) только теги XML, пропустив все значения между тегами? - PullRequest
0 голосов
/ 27 февраля 2019

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

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

int main()
{
    char str1[50] = {"<a>1</a><b>2</b><c>3</c>"};
    char str2[20];
    int i;
    i = 0;

    while(str1[i] !='\0')
    {
        if(str1[i] == '<' || str1[i] >= 'A' && str1[i] <='Z' || str1[i] >= 'a' && str1[i] <='z')
        {
            str2[i] = str1[i];
        }
        i++;
        printf("%s",str2);
    }
}

Фактический вывод: <<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a

Ожидаемый результат: <a></a><b></b><c></c>

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

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

Очень простой подход для вашей задачиискать '<', а затем копировать все следующие символы, пока не появится '>'.Это может выглядеть следующим образом:

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

int main()
{
    char str1[50] = {"<a>1</a><b>2</b><c>3</c>"};
    char str2[50] = { 0 };
    int i, j;
    i = 0;
    j = 0;

    while(str1[i] !='\0')
    {
      if(str1[i] == '<')
      {
        // Found tag
        // Now copy all characters to str2 until end-of-tag is found
        do
        {
          str2[j++] = str1[i++];
          if (str1[i] =='\0') exit(1); // Unexpected format.. terminate
        } while (str1[i] != '>');
        str2[j++] = str1[i];           // Also copy the '>'
      }
      ++i;
    }
    printf("%s\n",str2);
}

Однако обратите внимание, что синтаксический (пользовательский) ввод является довольно сложной задачей, потому что вам нужно обрабатывать все виды ошибок во входных данных.Приведенный выше код не имеет (почти) никакой проверки ошибок и поэтому бесполезен для передачи реального (пользовательского) ввода.Код обрабатывает только «правильно сформированный» ввод.

0 голосов
/ 27 февраля 2019

Пожалуйста, обратите внимание, что он не охватывает все сценарии тестовых случаев.

В моем коде есть некоторые проблемы со написанием кода, но я внес как можно меньше изменений, чтобы вы могли понять изменениясделано.

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

int main()
{
    char str1[50] = {"<a>1</a><b>2</b><c>3</c>"};
    char str2[20];
    int i,j;
    i = 0,j = 0;

    while(str1[i] !='\0') {
        if(str1[i] == '<' ){
            do {
                str2[j] = str1[i];
                i++;
                j++;

             }while( str1[i] >= 'A' && str1[i] <='Z' || str1[i] >= 'a' && str1[i] <='z' || str1[i] == '/');

             if(str1[i] == '>' ){
                str2[j] = str1[i];
                i++;
                j++;
                continue;
             }
             else {
                //todo error condition
             }
        }
        i++;
    }
    str2[j] = '\0';
    printf("%s",str2);

}
0 голосов
/ 27 февраля 2019

Вам нужно улучшить свой код:

  • Прежде всего, включите в скобки две пары AND,
  • Забыл включить в оператор if косую черту (/) ибольший символ (>)
  • Вам понадобится вторая переменная int для индексации массива str2
  • printf будет вне времени.

Также хорошоинициализировать str2 с 0 значениями.См. Memset.

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