#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:
Независимо от того, анализируете ли вы строки или файлы, вы всегда можете попробовать использовать соответствующие классы потоков, если вы уверены, что не получите искаженный ввод.