Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для EfimKR
57 / 30 / 13
Регистрация: 24.06.2014
Сообщений: 255
Записей в блоге: 1

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

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

Студворк — интернет-сервис помощи студентам
Есть строка (массив типа char), в которой содержится информация о сотруднике: фамилия, имя, отчество, возраст и номер телефона. Как из этой строки получить отдельно эти элементы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2014, 14:51
Ответы с готовыми решениями:

Ввести фамилию, имя, отчество, возраст жителя Среднего Урала
Ввести фамилию, имя, отчество, возраст жителя Среднего Урала. а)Вывести инициалы и пол человека б)определить, относится ли его возраст...

Строки: вывести фамилию, имя и отчество студента, у которого самое короткое отчество
С клавиатуры вводится текст, который представляет собой список студентов группы с указанием фамилии, имени и отчества студента, которые...

Записи и типизированные файлы. Структура: фамилия, имя, отчество, год установки телефона, номер телефона
Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонента, его имя и отчество, год установки...

10
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 15:07
Установи между ними символ-разделитель какой-нибудь. Типа строка: "фамилия::имя::отчество::возраст::но мер"
А потом распарсить и все.
0
 Аватар для EfimKR
57 / 30 / 13
Регистрация: 24.06.2014
Сообщений: 255
Записей в блоге: 1
27.09.2014, 15:52  [ТС]
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
19 / 19 / 14
Регистрация: 23.09.2014
Сообщений: 117
27.09.2014, 15:54
EfimKR, одинаковый код нужно выносить в функцию. Ну и задача решается проще через istringstream.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 16:37
Все можно сделать намного проще:\
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
57 / 30 / 13
Регистрация: 24.06.2014
Сообщений: 255
Записей в блоге: 1
27.09.2014, 17:08  [ТС]
MakItSim, это и есть функция. Принимает одну строку, возвращает отдельное поле.

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

Но спасибо за помощь, принцип тут схожий, коду правда меньше.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
27.09.2014, 18:02
Функции, начинающиеся с "_" стандартные, просто этот символ в начале обозначает, что функцию переделывали
Векторы - тот же массив, но с указанием типа хранимых данных (очень кратко если), если подробнее, то нужно с STL знакомиться.
Вроде всё))
0
 Аватар для MakItSim
19 / 19 / 14
Регистрация: 23.09.2014
Сообщений: 117
27.09.2014, 20:20
Цитата Сообщение от EfimKR Посмотреть сообщение
MakItSim, это и есть функция. Принимает одну строку, возвращает отдельное поле
Я вижу, что это функция. Только эта функция содержит кучу дублирующего кода, который сма должен быть функцией.
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
27.09.2014, 23: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
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
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
29.09.2014, 13:43
Ошибочка вкралась:

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

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

for( ; i!=cregex_token_iterator() && count < ss_last; i++, count++ )
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
29.09.2014, 17:17
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2014, 17:17
Помогаю со студенческими работами здесь

Строки: ввести фамилию, имя и отчество, вывести имя в столбик
Ввести фамилию, имя и отчество как одно данное строкового типа. Вывести имя в столбик.

Ввести имя, отчество и фамилию; поменять имя и отчество местами
Ввести имя, отчество и фамилию. Поменять имя и отчество местами (через тип данных string) &quot;Отчество, имя и фамилия&quot; Ни типо...

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

Дописать в файл имя, фамилию и номер телефона вашего товарища
Прощу помощи в решение : Напишите программу, которая дописывает в находящийся на диске файл имя, фамилию и номер телефона, например, вашего...

Выведите в окне сообщение свою фамилию, имя отчество с новой строки
Помогите выполнить: Первое задание Создать кнопку,назначить ей макрос:в первом окне ввода ввести своего любимого поэта, во...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru