Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EfimKR
53 / 26 / 10
Регистрация: 24.06.2014
Сообщений: 229
Записей в блоге: 1
#1

Получить из строки отдельно фамилию, имя, отчество, возраст и номер телефона - C++

27.09.2014, 14:51. Просмотров 979. Ответов 10
Метки нет (Все метки)

Есть строка (массив типа char), в которой содержится информация о сотруднике: фамилия, имя, отчество, возраст и номер телефона. Как из этой строки получить отдельно эти элементы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2014, 14:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить из строки отдельно фамилию, имя, отчество, возраст и номер телефона (C++):

Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам - C++
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам (математика, физика, русский язык,...

Строка S содержит фамилию, имя, отчество. Необходимо преобразовать ее в строку, содержащую фамилию и инициалы - C++
Строка S содержит фамилию, имя, отчество. Необходимо преобразовать ее в строку, содержащую фамилию и инициалы. _______ Как это задание...

Ввести фамилию, имя и отчество как одно данное типа строка. Определить длину строки - C++
Помогите искал похожее нету. Ввести фамилию, имя и отчество как одно данное типа строка. Определить длину строки и количество букв "а" в...

Написать программу, формирующую из одной строки, содержащей фамилию, имя и отчество строку с фамилией и инициалами - C++
Написать программу, формирующую из одной строки, содержащей фамилию, имя и отчество строку с фамилией и инициалами

Структуры. Записать отдельно имя и фамилию и отдельно числа - C++
Есть текстовый файл по типу : Ivanov Ivan 4 8 5 9 Petrov Petr 5 2 3 4 Ktoto Tam 5 4 1 2 Есть структура: struct My { ...

Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество - C++
Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество

10
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 15:07 #2
Установи между ними символ-разделитель какой-нибудь. Типа строка: "фамилия::имя::отчество::возраст::номер"
А потом распарсить и все.
0
EfimKR
53 / 26 / 10
Регистрация: 24.06.2014
Сообщений: 229
Записей в блоге: 1
27.09.2014, 15:52  [ТС] #3
angryjack93, можно более подробно объяснить?

Сам решил вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void info (char empl[] ,char fam[], char name[], char name2[], char age[], char numb[])
{
    int i = 0;
    int k = 0;
    while (empl[i] != ' ')
    {
        fam[k] = empl[i];
        k++; i++;
    }
    
    i++;
    k = 0;
    while (empl[i] != ' ')
    {
        name[k] = empl[i];
        k++; i++;
    }
        
    i++;
    k = 0;
    while (empl[i] != ' ')
    {
        name2[k] = empl[i];
        k++; i++;
    }
 
    i++;
    k = 0;
    while (empl[i] != ' ')
    {
        age[k] = empl[i];
        k++; i++;
    }
 
    i++;
    k = 0;
    while (empl[i] != '\0')
    {
        numb[k] = empl[i];
        k++; i++;
    }
    
}
Добавлено через 18 минут
Но тут нет защиты от дурака, сейчас вот над ней работаю.

Добавлено через 4 минуты
Вот с защитой. Но для корректной во всех случаях работы к исходной строке нужно добавить пробел.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//------------------------------------------------------------------ Разбивает исходную строку на отдельные поля. Имеет "защиту от дурака":
void info (char empl[] ,char fam[], char name[], char name2[], char age[], char numb[])    //если случайно нажать ентер во время ввода, 
{                                                                                           // отработает корректно.
    int i = 0;
    int k = 0;
    while (empl[i] != ' '&&empl[i] != '\0')
    {
        fam[k] = empl[i];
        k++; i++;
    }
    
    if (k)
        i++;
    k = 0;
    while (empl[i] != ' '&&empl[i] != '\0')
    {
        name[k] = empl[i];
        k++; i++;
    }
        
    if (k)
        i++;
    k = 0;
    while (empl[i] != ' '&&empl[i] != '\0')
    {
        name2[k] = empl[i];
        k++; i++;
    }
 
    if (k)
        i++;
    k = 0;
    while (empl[i] != ' '&&empl[i] != '\0')
    {
        age[k] = empl[i];
        k++; i++;
    }
 
    if (k)
        i++;
    k = 0;
    while (empl[i] != '\0'&&empl[i] != '\0')
    {
        numb[k] = empl[i];
        k++; i++;
    }
    
}
0
MakItSim
17 / 17 / 9
Регистрация: 23.09.2014
Сообщений: 117
27.09.2014, 15:54 #4
EfimKR, одинаковый код нужно выносить в функцию. Ну и задача решается проще через istringstream.
0
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 16:37 #5
Все можно сделать намного проще:\
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <vector>
#include <sstream>
 
void ParsingStr(std::string &str);
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string user_str;
    char symb;
    std::cout << "Your informations: ";
    std::getline(std::cin, user_str);
    ParsingStr(user_str);
    _getch();
    return 0;
}
 
void ParsingStr(std::string &str){
    std::vector <std::string> inf(5);
    int numStr = 0;
    for (int i = 0; i < str.size(); i++){
        if (str[i] == ' ') { numStr++; i++; }   //в качестве разделителя пробел
        inf[numStr] += str[i];
    }
    std::cout << "name: " << inf[0] << '\n';
    std::cout << "familia: " << inf[1] << '\n';
    std::cout << "name_2: " << inf[2] << '\n';
    std::cout << "age: " << inf[3] << '\n';
    std::cout << "telephone: " << inf[4] << '\n';
}
Ну или, как написали выше, переделать с использованием std::istringstream.
0
EfimKR
53 / 26 / 10
Регистрация: 24.06.2014
Сообщений: 229
Записей в блоге: 1
27.09.2014, 17:08  [ТС] #6
MakItSim, это и есть функция. Принимает одну строку, возвращает отдельное поле.

angryjack93, я же потенциально только приступил к изучению строк. И тут на мне - и вектор и нестандартные функции с началом "_" и с припиской что это проще моего.
От простоты аж зубы ноют ))

Но спасибо за помощь, принцип тут схожий, коду правда меньше.
0
angryjack93
7 / 3 / 1
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 18:02 #7
Функции, начинающиеся с "_" стандартные, просто этот символ в начале обозначает, что функцию переделывали
Векторы - тот же массив, но с указанием типа хранимых данных (очень кратко если), если подробнее, то нужно с STL знакомиться.
Вроде всё))
0
MakItSim
17 / 17 / 9
Регистрация: 23.09.2014
Сообщений: 117
27.09.2014, 20:20 #8
Цитата Сообщение от EfimKR Посмотреть сообщение
MakItSim, это и есть функция. Принимает одну строку, возвращает отдельное поле
Я вижу, что это функция. Только эта функция содержит кучу дублирующего кода, который сма должен быть функцией.
0
sergestus
76 / 76 / 23
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
27.09.2014, 23:11 #9
Еще данную задачу с помощью регулярных выражений можно решить:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "conio.h"
#include <iostream>
#include <regex>
#include <string>
 
using namespace std;
 
enum SubString{ ss_surname, ss_name, ss_patronymic, ss_age, ss_phone, ss_last };
enum { max_str_len = 256 };
 
bool SplitString( const char *inputString, char *outputSubStrings )
{
  regex expression("([^\\s]+)"); 
  cregex_token_iterator i(inputString, inputString+strlen(inputString), expression);
  int count = 0;
 
  for( ; i!=cregex_token_iterator(), count < ss_last; i++, count++ )
    strcpy( outputSubStrings+count*max_str_len, i->str().c_str() );
 
  return count == ss_last;
}
 
int main()
{
    const char *inputString = "ivanov ivan ivanovich 20 1111111";
    char outputSubStrings[ss_last][max_str_len];    
    
    cout << "Parsing line:" << inputString << endl;
 
    if( SplitString(inputString,*outputSubStrings) == false ) 
      cout << "Some error happened wihle parsing line..." << endl;
    else 
    {
      cout << "Surname    "  << outputSubStrings[ss_surname]    << endl;
      cout << "Name       "  << outputSubStrings[ss_name]       << endl;
      cout << "Patronymic "  << outputSubStrings[ss_patronymic] << endl;
      cout << "Age        "  << outputSubStrings[ss_age]        << endl;
      cout << "Phone      "  << outputSubStrings[ss_phone]      << endl;
    }
    getch();
}
1
sergestus
76 / 76 / 23
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
29.09.2014, 13:43 #10
Ошибочка вкралась:

for( ; i!=cregex_token_iterator(), count < ss_last; i++, count++ )

вместо запятой нужно операцию логического "и" поставить:

for( ; i!=cregex_token_iterator() && count < ss_last; i++, count++ )
0
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
29.09.2014, 17:17 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
   char Stroka[]="Family Name Otch ...Age Number"; //Исходная строка
    char Family[255]="",Name[255]="",Otch[255]="",Age[255]="",Number[255]="";
   int count_=0;
   const char *separator=" ,."; //Разделители
 
 
    char *pch=strtok(Stroka,separator);
    while (pch){
        switch (count_){
           case 0: strcpy(Family,pch); count_++; break;
           case 1: strcpy(Name,pch);   count_++; break;
           case 2: strcpy(Otch,pch);   count_++; break;
           case 3: strcpy(Age,pch);    count_++; break;
           case 4: strcpy(Number,pch); count_++; break;
           }
        pch=strtok(NULL,separator);
    }
 
cout<<Family<<"   "<<Name<<"   "<<Otch<<"   "<<Age<<"   "<<Number<<"\n";
 
return 0;
}
0
29.09.2014, 17:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2014, 17:17
Привет! Вот еще темы с ответами:

Пользователь вводит фамилию, имя и отчество в отдельные динамические массивы - C++
Кто знает, как решается задача на С++? Задача на строки. Пользователь вводит фамилию, имя и отчество в отдельные динамические массивы....

Ввести фамилию, имя отчество как одного типа строка - C++
Ввести фамилию, имя отчество как одного типа строка. Определить длину строки и количество букв &quot;а&quot; в ней. Дополнительные задания: 1)...

Ввести имя фамилию и отчество как одно данное типа строка. Определить длину строки и количество гласных в нем. Удалить все буквы "а" и "о" в фамилии. - C++
Помогите пожалуйста. Очень нужно сделать программу. Ввести имя фамилию и отчество как одно данное типа строка. Определить длину строки и...

Ввести фамилию, имя и отчество как одно данное типа строка. Заменить на инициалы - C++
Ввести фамилию, имя и отчество как одно данное типа строка. Определить длину строки и количество букв «а» в нем. Выполнить задачи своего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.