Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/121: Рейтинг темы: голосов - 121, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 30.10.2014
Сообщений: 82

Разбиение строки по пробелу

28.01.2015, 18:45. Показов 25412. Ответов 10
Метки нет (Все метки)

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

Прочитал кучу тем о strtok() и других методах. Хочу понять как для моей задачи воспользоваться strtok(). Знаю, что strtok изменяет строку. Спустя часа размышлений и чтений тем пришел к выводу, что я неправильно ее использую.
C++
1
2
3
4
5
6
7
8
9
10
11
char st[256];
    cout << " =";
    cin >> st;
    
    char * st1 = strtok(st, " ");
    while (st1 != NULL)
    {
        cout << st1 << endl;
        st1 = strtok(NULL, " ");
    }
    system("PAUSE");
Для начала я бы хотел понять как мне вытянуть все 3 лексемы(имя, фамилия, отчество), а дальше уже не составит труда посчитать размер каждого и тд. Может кто помочь, пожалуйста.(желательно объяснить)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2015, 18:45
Ответы с готовыми решениями:

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

Отформатировать текст: каждое предложение с новой строки, между словами - по одному пробелу
Задача: Дан текстовый файл. Переписать его текст в новый файл таким образом, чтобы каждое предложение начиналось с новой строки и между...

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

10
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.01.2015, 18:52
Перегруженный operator>> будет читать до разделителя. Так что
C++
1
std::cin>>f>>n>>o ;
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.01.2015, 18:53
C++
1
2
3
char * fam = strtok(st, " ");
char * im = strtok(NULL, " ");
char * otch = strtok(NULL, " ");
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
28.01.2015, 18:54
Информация о strtok:
Кликните здесь для просмотра всего текста

Функция strtok
#include <string.h>
char *strtok(char *str1, const char *str2);

Функция strtok() возвращает указатель на следующую лексему в строке, адресуемой параметром str1. Символы, образующие строку, адресуемую параметром str2, представляют собой разделители, которые определяют лексему. При отсутствии лексемы, подлежащей возврату, возвращается нулевой указатель.

В версии С99 к параметрам str1 и str2 применен квалификатор restrict.

Чтобы разделить некоторую строку на лексемы, при первом вызове функции strtok() параметр str1 должен указывать на начало этой строки. При последующих вызовах функции в качестве параметра str1 нужно использовать нулевой указатель. Этим способом вся строка разбивается на лексемы.

При каждом обращении к функции strtok() можно использовать различные наборы разделителей.

Пример
Эта программа разбивает строку "Травка зеленеет, солнышко блестит" на лексемы, разделителями которых служат пробелы и запятые. В результате получится

Травка|зеленеет|солнышко|блестит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
int main(void)
{
  char *p;
 
  p = strtok("Травка зеленеет, солнышко блестит", " ");
  printf(p);
  do {
    p = strtok('\0', ", ");
    if(p) printf("|%s", p);
  } while(p);
 
  return 0;
}
0
1 / 1 / 0
Регистрация: 30.10.2014
Сообщений: 82
28.01.2015, 18:59  [ТС]
Croessmah, Не понял, что вы имеете ввиду. Может не понимаю как действует код.
C++
1
char * st1 = strtok(st, " ");
- обозначение с какой строкой работать, по какому разделителю, и куда отдавать полученную подстроку.
Дальше я просто перебираю подстроки которые выдает по разделителю(по идее должно 3 слова быть).
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.01.2015, 19:02
Лучший ответ Сообщение было отмечено Khad515 как решение

Решение

Khad515, у Вас cin>>st прочитает строку только до пробела (или другого разделителя). Так что либо читайте строку целиком, а потом разбивайте, либо читайте фамилию имя и отчество отдельно.
1
1 / 1 / 0
Регистрация: 30.10.2014
Сообщений: 82
28.01.2015, 19:05  [ТС]
nmcf, тоесть так?
C++
1
2
3
4
5
6
7
8
9
10
11
char st[256];
    cout << " =";
    cin >> st;
    
    char * fam = strtok(st, " ");
    char * im = strtok(NULL, " ");
    char * otch = strtok(NULL, " ");
    cout << fam << endl;
    cout << im << endl;
    cout << otch << endl;
    system("PAUSE");
Код я понял, мы этими строками перебираем слова.
Выводит 1е слово, а потом
Unhandled exception at 0x013264D1 in zad7_3.exe: 0xC0000005: Access violation reading location 0x00000000.

Добавлено через 2 минуты
Croessmah, дошло, но мне в задаче надо, что бы я ввел полностью строку, а потом считал размер каждого слова.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.01.2015, 19:08
Лучший ответ Сообщение было отмечено Khad515 как решение

Решение

Ну так здесь нет контроля ошибок, строка должна быть из трёх слов. Ты неверно вводишь, надо
C++
1
cin.getline(st, 256);
1
1 / 1 / 0
Регистрация: 30.10.2014
Сообщений: 82
28.01.2015, 19:14  [ТС]
nmcf, заработало!Спасибо. getline разрешает вводить строку с пробелами?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.01.2015, 19:15
Лучший ответ Сообщение было отмечено Khad515 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cstring>
 
int main()
{
   char buffer[200] ;
   std::cin.getline(buffer,200) ;
   char * f = strtok(buffer," ") ;
   while ( f )
   {
      std::cout << f << std::endl ;
      f=strtok(NULL," ") ;
   }
}
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.01.2015, 19:17
Разрешает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2015, 19:17
Помогаю со студенческими работами здесь

Вывести строку, содержащую символы заданной строки, между которыми вставлено по одному пробелу
Что то вот на решал, немного вроде не так посмотрите оцените пожалуйста; /* Дана непустая строка S . Вывести строку, содержащую символы...

Разбиение строки
Доброго времени суток. Я новичок в кодинге. Передо мной такая задача: есть строка str с числами, разделенными через пробел. ...

Разбиение строки на слова
записываем слова через токен в массив))) не работает if который сразу после for помогите плиз....))) заранее спасибо)))) в конце...

Разбиение строки на части
Стандартная функция С strtok() по-своему конечно очень удобна, но в С++ со строками её применять довольно хлопотно. Стандартная функция С++...

Разбиение текстовой строки
Не могу вызвать функцию strtok(); Вот код: int main(){ char *value, *V; int month, day; cin &gt;&gt; value; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru