Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
24 / 19 / 8
Регистрация: 21.04.2019
Сообщений: 494

Разбить строку используя указанный разделитель

09.07.2019, 06:34. Показов 7432. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа ждет ввода строки неограниченной длины.
Затем программа ждет ввода символа.
После чего она должна разбить первую строку в другие подстроки, используя второй параметр в виде разделителя и вывести на экран.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2019, 06:34
Ответы с готовыми решениями:

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

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

Посмотрите код! (используя функцию strtok, разбить телефонный номер формата (555) 555-5555, введенный как строку, на лексемы)
Посмотрите код все правильно ли??? Задание звучит так, используя функцию strtok, разбить телефонный номер формата (555) 555-5555, введенный...

9
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
09.07.2019, 08:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int main() {
  char *p,*s,ch[2]="";
  string str;
  size_t len;
 
  getline(cin,str);
  cin>>ch;
  len=str.length();
  s=new char[len+1];
  strcpy(s,str.c_str());
  p=strtok(s,ch);
  while(p){
     if(p)cout<<p<<"\n";
     p=strtok('\0',ch);
    }
  system("pause");
  return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
09.07.2019, 09:17
Цитата Сообщение от повар1 Посмотреть сообщение
p=strtok('\0',ch);
Синтаксис:
C++
1
char * strtok( char * string, const char * delim );
Не имеете морального права подсовывать char вместо char*.
В последующие вызовы, функция ожидает нулевого указателя и использует позицию сразу после окончания последней лексемы как новое местонахождение для сканирования
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
09.07.2019, 10:45
zss,
Цитата Сообщение от zss Посмотреть сообщение
ch
это строка содержащая разделители. В данном случае это один символ.
И где здесь криминал?
0
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
09.07.2019, 10:51
Цитата Сообщение от повар1 Посмотреть сообщение
И где здесь криминал
Криминал не здесь, а в '\0'.
Это не строка, а одиночный символ.
Вам повезло, что вы передали символ, код которого равен нулю.
Он преобразовался в нулевой указатель, и функция сработала.
1
24 / 19 / 8
Регистрация: 21.04.2019
Сообщений: 494
09.07.2019, 14:06  [ТС]
Сам написал. Может кому пригодится.

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
#include <iostream>
#include <string>
 
using namespace std;
 
void parsString(string str, char ch)
{
    int strLength = 0;
    while(strLength <= str.size())
    {
        if(str[strLength] == ch) cout << endl;
        else if(str[strLength-1] == ch && str[strLength] ==' '){strLength++;continue;}//continue;
        else cout << str[strLength];
        strLength++;
    }
 
}
int main()
{
    setlocale(0,"");
    cout << "Hello, team! \n" << endl;
    string str;
    char ch;
    while(1)
    {
        str = "";ch = ' ';
        cout << "\nInput the string(or \"exit\" for close the programm):\n# ";
        getline(cin, str);
        if(str == "exit")break;
        //if(str == "")continue;
        cout << "Input a character:\n# ";
        ch = cin.get();
        cout << "Result: \n";
        parsString(str,ch);
        cin.ignore(); 
    }
  
    return 0;
}
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
09.07.2019, 15:07
Цитата Сообщение от zss Посмотреть сообщение
В последующие вызовы, функция ожидает нулевого указателя и использует позицию сразу после окончания последней лексемы как новое местонахождение для сканирования
Исходник функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *strtok(char * str, const char * delim)
{
    static char* p=0;
    if(str)
        p=str;
    else if(!p)
        return 0;
    str=p+strspn(p,delim);
    p=str+strcspn(str,delim);
    if(p==str)
        return p=0;
    p = *p ? *p=0,p+1 : 0;
    return str;
}
Так что там ожидает функция?
0
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
09.07.2019, 15:15
Цитата Сообщение от повар1 Посмотреть сообщение
C++
1
2
 if(str)
        p=str;
Т.о., если передадите не нуль - получите
неправильный указатель.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
09.07.2019, 16:01
Цитата Сообщение от zss Посмотреть сообщение
p=str;
А это разве не присвоение указателю строки? А если в исходнике функции заменить строчку 3 на:
C++
1
static char* p='\0';
функция тоже работает.
0
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
09.07.2019, 16:23
повар1, ну нет здесь повода для спора.
Нужно передать нулевой указатель, а не адрес строки, содержащей ноль.
Попробуйте, поменяйте
Цитата Сообщение от повар1 Посмотреть сообщение
C++
1
p=strtok('\0',ch);
на
C++
1
p=strtok("\0",ch);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2019, 16:23
Помогаю со студенческими работами здесь

Используя рекурсивную функцию напечатать указанный рисунок
12. Используя рекурсивную функцию, напечатать следующую таблицу

Распечатать данные в массиве сведения, используя указанный образец
Бился-бился,не добился результата. Пожалуйста помогите. Задан массив, содержащий в себе сведения о сотрудниках учреждения такого...

Используя указанный оператор цикла, табулировать заданную функцию
1. В каждом варианте требуется, используя указанный оператор цикла, табулировать заданную функцию F на отрезке с шагом Step и построить её...

Найти прирост суммы вклада за указанный период времени, используя циклы
Напишите программу с помощью циклов.Гражданин 1 марта открыл счет в банке, вложив 1000 руб. Через каждый месяц размер вклада увеличивается...

Вывести строку через разделитель «+» все цифры пятизначного числа в обратном порядке. Без использования циклов
Помогите решить задачу: Вывести строку через разделитель «+» все цифры пятизначного числа в обратном порядке. Без использования циклов


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru