Как разделить строку на слова c
Перейти к содержимому

Как разделить строку на слова c

  • автор:

разделить строку на слова си

Слова разделяются одним или несколькими пробелами и знаками пунктуации (“,”, “;”, “:”, “-”, “.”, “!”, “?”). scanf, sscanf или strtok нельзя. Каким образом это можно сделать?

Отслеживать
задан 28 апр 2020 в 10:11
13 4 4 бронзовых знака
28 апр 2020 в 10:45

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

#include int main() < char c; char str[80][20]; //допустим, предложение из 80 слов, а слово максимум состоит из 20 букв int i = 0, j = 0, num_nw = 0, word = 0; while((c = getchar()) != '\n')//пока строка не кончилась, считываем каждый символ < if(c == ' ' || c == ',' || c == ';' || c == ':' || c == '-' || c == '.' || c == '!' || c == '?')//если встречены разделители < if(num_nw == 0 && word >0) < str[i][j] = '\0';//обозначаем конец слова str[i++][j];//теперь мы хотим записывать новое слово j = 0;//и желательно в начало выделенной памяти под слово >num_nw++;//это разделитель, прибавляем 1 > else < str[i][j++] = c; //записываем слово num_nw = 0;//теперь это не разделитель, их число приравниваем нулю word++;//прибавляем 1 к числу слов >> str[i][j] = '\0';//обозначаем конец слова return 0; > 

Отслеживать
ответ дан 28 апр 2020 в 17:05
user366097 user366097
И что получится, если перед первым словом есть разделители? А если после последнего слова их нет?
28 апр 2020 в 18:09
Спасибо. Исправил)
– user366097
29 апр 2020 в 9:40

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420

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

Как это можно грамотно реализовать? Нужно ли, например, сразу в условный буфер прочитать строку и работать с ней? Или посимвольно читать и через свитчи обрабатывать? Разделитель пробел или табуляция. Кодом ответ не нужен, хотя бы с чего начать. Далее разделение будет включать ещё и учитывание пробелов в составе слова и т.д. То есть с помощью спец символов можно будет записать в одно звено списка что-то вроде «asd fg». Но сейчас мне требуется грамотное начало для разбиения строки просто на слова. Желательно без использования string.h и точно никакого ++ кода.

Отслеживать
задан 13 авг 2022 в 22:10
383 1 1 серебряный знак 10 10 бронзовых знаков

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

13 авг 2022 в 23:01

Можно считать всю строку, можно посимвольно. Можно и через свитчи 🙂 Можно (но я так понял, запрещено преподавателем) через strtok . С чего начать? С написания какого-то из вариантов. Это не та задача, в которой вы можете затратить неделю работы, чтобы потом понять, что пошли не тем путем. Просто начинайте реализовывать какой-то из вариантов, а дальше работа сама покажет.

14 авг 2022 в 5:02

@Harry, это будет в итоге командный интерпретатор, задача просто разделена на много частей, это начало 😀 так что возможно неделю все таки займёт)

14 авг 2022 в 8:37

@StanislavVolodarskiy, код начальный ни к чему, варианты которые вижу я описал, просто не совсем понимаю какой выбирать для дальнейшего расширения ))

Как разделить строки на слова, и после их использовать

Author24 — интернет-сервис помощи студентам

Здравствуйте, как разделить строки на слова а после их использовать ?? Я посмотрел в инете стрток попробывал но так и не понял как он работает, пытаюсь вывести определенное слово он мне выводит дичь.

Добавлено через 17 минут

1 2 3 4 5 6 7 8 9 10 11
char s[100]; //длинная строка char s1[50][9]; //строка, в которой будет отбиратся палендром char s2[10]; //строка с палендромом char *lex; //знаки остановки gets(s); //считываем из потока ввода строку lex=strtok(s, " -. "); //задаем точки разбора на лексемы for(i = 0; lex!= '\0'; i++ ) { strcpy(s1[i], lex); lex = strtok (NULL, " -. "); //при окончании слов }

Далее выводим эти слова как обычный массив printf(«%s», s1[номер лексемы]);
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

как после найденного слова сохранить три строки после него
Допустим есть файл с определёнными слова, и файл с данными. Необходимо сравнить два файла и при.

Разделить строки на слова
Доброго времени суток. Помогите пожалуйста исправить ошибку. Не работает разделение строки на.

Разделить все слова строки на три типа
Дана строка. Написать программу, разделяющую все слова строки на три типа – идентификаторы, целые.

Разделить каждый элемент строки разделить на сумму элементов этой строки
Задан двухмерный массив вещественных чисел А(n,m). Необходимо каждый элемент соответствующей строки.

Невнимательный
2605 / 980 / 325
Регистрация: 08.02.2013
Сообщений: 5,759
Записей в блоге: 2
Из википедии ,) вроде работает

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int main () { char str[] = "Это не баг, это фича."; printf("Разделение строки \"%s\" на лексемы.", str); char *pch = strtok (str, " ,."); //во втором параметре указаны разделители (пробел, запятая, точка) printf("\nЛексемы:"); while (pch != NULL) //пока есть лексемы { printf("\n%s", pch); pch = strtok (NULL, " ,.-"); } return 0; }

Добавлено через 36 минут

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int main () { int i,u; char s[100]; //длинная строка char s1[50][9]; //строка, в которой будет отбиратся палендром char s2[10]; //строка с палендромом char *lex; //знаки остановки fgets(s, 100, stdin); //считываем из потока ввода строку lex=strtok(s, " -. "); //задаем точки разбора на лексемы for(i = 0; lex!= NULL; i++ ) { strcpy(s1[i], lex); lex = strtok (NULL, " -. "); //при окончании слов } for(u = 0; ui; u++ ) printf ("%s\n", s1[u]); return 0; }

Ваш код тоже работает, хотя если заменить ‘\0’ на NULL
то нет предупреждеений
./test.c: In function ‘main’:
./test.c:15:15: warning: comparison between pointer and zero character constant [-Wpointer-compare]
for(i = 0; lex!= ‘\0’; i++ )
^~
./test.c:15:12: note: did you mean to dereference the pointer?
for(i = 0; lex!= ‘\0’; i++ )
И никак не хочет собирать с gets(s) пришлось менять на fgets(s, 100, stdin)

Разбить строку на слова С++

Именно какой синтаксический анализатор вам нужен не до конца понятно. Но std::istream::operator>> и так считывает до символа разделителя, поэтому std::getline не нужна. Если хотите убрать конечные запятые, то:

while (ss >> tmp)

Если хотите разделять tmp по какому то символу(например, если запятые есть в любом месте слова), тогда тут можно использовать один из многочисленных вариантов. Чисто для демонстрации с применением std::getline можно использовать не самый удачный вариант:

while (ss >> tmp) < std::istringstream s(tmp); bool valid = true; while (std::getline(s, tmp, ',')) < valid = false; words.push_back(tmp); >if (valid) < if (tmp.back() == ',') tmp.pop_back(); words.push_back(tmp); >> 

Если вам нужно обработать строку, то используйте методы класса _ это самый эффективный способ. Для разбиения строки по нескольким разделителям, используйте std::string::find_first_of . Как это сделать? В сайте бывали такие вопросы, так что на них уже отвечали. Поищите, покопайтесь и найдете, а лучше пытайтесь решать самостоятельно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *