Понимание синтаксического анализа данных на C (для начинающего программиста)

#c #string #parsing #stack

#c #строка #синтаксический анализ #стек

Вопрос:

У меня есть данные в формате: (Данные могут быть введены в виде строки или из файла, на наш выбор, но я предпочитаю строку)

First_Name Last_Name Номер Дата Продолжительность

например: John Doe 5593711872 09122010 12

Мне нужно проанализировать эти данные, а затем поместить их в класс «Контакты», по одному на каждую запись.

Затем мне нужно поместить 5 из этих записей в стек и распечатать их.

Я знаю, как это обработать, но как мне проанализировать и разделить эти данные на соответствующие разделы?

(редактировать, добавляя тот небольшой фрагмент кода, который у меня есть. Я ищу больше понимания, чем кода, или это не так, как работает этот сайт?)

contact.h:

  #ifndef contact_h
#define contact_h

#include <iostream> //this is the set of functions we need to "overload" and break out
using std::ostream; //use both output halves
using stf::istream; //and input halves

#include <string>
using std::string;


class Contact
{
      friend ostream amp;operator<<( ostream amp;, const Contact amp; ); //from example 11.3 in powerpoint 3
      friend ostream amp;operator>>( istream amp;, Contact amp; ); //also from example 11.3 in powerpoint 3
private:
        string first;
        string last;
        string number;
        string date;
        int talk_time;
};
  

Phone.h

 #ifndef phone_h
#define phone_h

#include <iostream> //this is the set of functions we need to "overload" and break out
using std::ostream; //use both output halves
using stf::istream; //and input halves

#include <string>
using std::string;

class Phone
{
      friend ostream amp;operator<<( ostream amp;, const Phone amp; ); 
      friend ostream amp;operator>>( istream amp;, Phone amp; ); 
private:
        string area; //area code segment
        string threes; //then the three-digit section
        string fours; //and lastly the four-digit section
};  //and this wraps up the phone class
  

date.h

 #ifndef date_h
#define date_h

#include <iostream> //this is the set of functions we need to "overload" and break out
using std::ostream; //use both output halves
using stf::istream; //and input halves

#include <string>
using std::string;


class Date
{
      friend ostream amp;operator<<( ostream amp;, const Date amp; ); //from example 11.3 in powerpoint 3
      friend ostream amp;operator>>( istream amp;, Date amp; ); //also from example 11.3 in powerpoint 3
private:
        string month;
        string day;
        string year;
};  //and this wraps up the date storage class

main.cpp

    #include <iomanip>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include "contact.h"
    #include "phone.h"
    #include "date.h"
    int main()
    {
//this is supposed to grab the numbers, and then i need something to grab the text and split it up
      char line_one[] = "Alex Liu 5592780000 06182011 15";
      char * pEnd;
      long int phone_number, date, minutes;
      phone_number = strtol (line_one,amp;pEnd,10);
      date = strtol (pEnd,amp;pEnd,10);
      minutes = strtol (pEnd,NULL,10);
      printf ("The numbers we get are: %ld, %ld, %ld.n", phone_number, date, minutes);
      return 0;
    }
  

Является ли strtol неправильной функцией для использования здесь?

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

Комментарии:

1. У вас есть какой-либо код для нас, чтобы работать? Если вы ничего не даете нам, то это бесплатный раздаточный материал.

Ответ №1:

Итак, в основном вы хотите прочитать две строки и три целых числа. Основной способ сделать это в C — использовать потоки:

 std::string first_name, last_name;
std::int64_t number;
std::int32_t date, duration;

input_stream
    >> first_name >> last_name
    >> number >> date >> duration;
  

Где input_stream может быть либо std::istringstream инициализировано из строки, которую вы получили в качестве входных данных, либо std::ifstream для чтения содержимого файла.

Комментарии:

1. Вы уверены 5593711872 , что поместитесь в целое число?

2. @cnicutar: Хороший улов, я это исправлю.

3. 1, хотя было бы неплохо, если бы вы упомянули искаженную обработку / обнаружение ввода

Ответ №2:

Самый простой способ анализа — использование потоков:

 std::ifstream fin("my_file.txt");
std::string name1, name2;
int number1, number2, number3;
fin >> name1 >> name2 >> number1 >> number2 >> number3;
  

Ответ №3:

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