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

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

  • автор:

Как разбить строку на слова и записать в масив

Не могу разобраться как разбить строку на слова и сохранить в массив как отдельные слова в языке Си. Пробую через strtok, но к сожалению отделает только первое слово. upd. Получаю от пользователя строку и записываю в массив Пример: input = cd .. argc[0] = cd argc[1] = .. Вот код:

char split(char *commadnForSpilt) < //FIX to strtok int i = 0; char *p = strtok (commadnForSpilt, " "); char *array[3]; while (p != NULL) < array[i++] = p; p = strtok (NULL, " "); >for (i = 0; i

Как разделить строки с помощью String.Split в C#

Метод String.Split создает массив подстрок, разбивая входную строку по одному или нескольким разделителям. Этот метод зачастую является самым простым способом разделить строку по границам слов. Он также используется для разбиения строк по другим конкретным символам или строкам.

Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.

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

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); foreach (var word in words) < System.Console.WriteLine($">"); > 

Каждый экземпляр знака разделения создает значение в возвращаемом массиве. Так как массивы в C# не индексируются, каждая строка в массиве индексируется от 0 до значения, возвращаемого Array.Length свойством минус 1:

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); for (int i = 0; i < words.Length; i++) < System.Console.WriteLine($"Index : >"); > 

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

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); foreach (var word in words) < System.Console.WriteLine($">"); > 

Такое поведение упрощает работу с такими форматами, как файл данных с разделителями-запятыми (CSV), которые представляют табличные данные. Идущие подряд запятые представляют пустой столбец.

Чтобы исключить из возвращаемого массива все пустые строки, можно передать необязательный параметр StringSplitOptions.RemoveEmptyEntries. Для более сложной обработки возвращенной коллекции можно использовать LINQ, чтобы управлять результирующей последовательностью.

String.Split может использовать несколько знаков разделения. В следующем примере используются пробелы, запятые, точки, двоеточия и вкладки в качестве разделительных символов, которые передаются Split в массив. Цикл в конце кода отображает каждое из слов в возвращенном массиве.

char[] delimiterChars = < ' ', ',', '.', ':', '\t' >; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine($"Original text: ''"); string[] words = text.Split(delimiterChars); System.Console.WriteLine($" words in text:"); foreach (var word in words) < System.Console.WriteLine($">"); > 

Последовательные экземпляры любого разделителя создают пустую строку в выходном массиве:

char[] delimiterChars = < ' ', ',', '.', ':', '\t' >; string text = "one\ttwo :,five six seven"; System.Console.WriteLine($"Original text: ''"); string[] words = text.Split(delimiterChars); System.Console.WriteLine($" words in text:"); foreach (var word in words) < System.Console.WriteLine($">"); > 

Метод String.Split может принимать массив строк (в этом случае в качестве разделителей при анализе целевой строки используются последовательности символов, а не отдельные символы).

string[] separatingStrings = < "; string text = "one'"); string[] words = text.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries); System.Console.WriteLine($" substrings in text:"); foreach (var word in words)

См. также

  • Извлечение элементов из строки
  • Строки
  • Регулярные выражения .NET

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

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

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

задание: вводится строка произвольной длинны. нужно сформировать несколько новых строк. в каждой строке должно содержаться одно слово.

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
#include #include #include #include void clear (char *q){ int i=0; for(; istrlen(q); ++i) *q='\0'; } char *trim(char *str){ const char *p; char *q; int l; q = malloc(strlen(str)+1); strcpy(q, ""); for (p=str; *(p+=strspn(p, " \t")); p+=l){ l=strcspn(p, " \t"); if (*q) strcat(q, " "); strncat(q, p, l); } q = realloc(q, strlen(q)+1); return q; } char *obtain_data(char *q){ int n=0; char *q1; char *str=malloc(strlen(q)+1); clear(str); printf("Put some text here:\n"); do{ n=scanf("%10[^\n]", q); if (str[0]=='\n') strcpy(str, q); if (str[0]!='\n'){ str=realloc(str, strlen(str)+strlen(q)+1); strcat(str, q); } clear (q); } while (n!=0); str=trim(str); q1=malloc(strlen(str)+1); strcpy(q1, str); free (str); free (q); return q1; } int findword(char *q){ int i=0, k=0; for(; istrlen(q)+1; ++i){ if (q[i]==' ') break; if (q[i]=='.') break; ++k; } return k; } char* cut (char *r, char *q){ int l=strlen(q), len=0; char *q1; char * f = strchr(q, ' '); len=findword(q); r=realloc(r, len+1); strncpy(r, q, len); q1=malloc(l-len); strncpy(q1, f+1, l-len-1); clear (q); q=realloc(q, l-len); strcpy(q, q1); free (q1); return r; } /*void defrag (char* q)  планируется сделать цикл из cut() >*/ int main() { int k=0; char* c=malloc(101); char *buff=malloc(11); buff=obtain_data(buff); c=cut(c, buff); printf ("%s\n%s\n", c, buff); getch(); }

у меня это дело работает так:

Я не понимаю откуда мусор берётся в новых строках. ЧЯДНТ?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Разбить строку на слова и удалить короткие слова
Разработать программу для подсчета, сколько слов содержится в строке. Слова разделены пробелями или.

Не получается разбить строку на слова
Подскажите пожалуйста почему не получается разбить строку на слова? strcat(string," "); for.

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

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

Регистрация: 22.01.2013
Сообщений: 59

заметил странную, тенденцию - такой кривой вывод бывает только при подаче слов из 4х букв.

обновлённый код функции cut():

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
char* cut (char *r, char *q){ int l=0, len=0; char *stg; l=strlen(q); len=findword(q); clear(r); r=realloc(r, len); strncpy (r, q, len); stg=malloc(l-len); strncpy(stg, q+len+1, l-len); clear (q); q=realloc(q, l-len); strcpy(q, stg); free (stg); return r; }

Заблокирован

Лучший ответ

Сообщение было отмечено Памирыч как решение

Решение

"Строка произвольной длины" - это знаете-ли вызов)

В данной реализации строка (скорее уже, текст) посимвольно записывается в файл, при этом подсчитывается длина.
Затем по подсчитанной длине создается динамическая строка, куда из файла сбрасываем текст.
Таким образом, "произвольная длина" ограничивается требованиями железа (винт, оперативка).

Разбивается на слова своей функцией, без использования strtok.

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#include #include #include #define N 50 //длина буфера для слова //в русском влезет: тысячадевятьсотвосьмидесятидевятимиллиметровый //в английском влезет: Supercalifragilisticexpialidocious //записываем текст в файл посимвольно, попутно считаем длину int lenOfSentence() { int cur = 0; char c; FILE *f = fopen("sentence.txt","w"); if(f == NULL) { printf("Scusi, temporary difficulties finding room for your sentence\n"); getchar(); exit(1); } printf("Put your sentence. Press ENTER' at the end:\n"); do { c = getchar(); if(c!= '\n') fputc(c,f); //убираем ENTER cur++; } while (c!= '\n'); fputc('\0',f); //добавляем символ конца строки fclose(f); return cur; //возвращаем длину текста в файле } //считываем текст из файла в динамическую строку заданной длины char *veryLongString(int len) { char *sentence; FILE *g = fopen("sentence.txt","r"); if(g == NULL) { printf("Scusi, temporary difficulties reading your sentence\n"); getchar(); exit(1); } sentence = (char*) malloc (len); fgets(sentence,len,g); fclose(g); return sentence; } //проверка: является ли символ знаком препинания int inDelimiters(char c) { int i; char delimiters [] = {' ','.',',','-',':',';','!','?'}; for(i=0;i8;i++) if(c == delimiters[i]) return 1; return 0; } //укоротить текст на слово слева char *cutSentenceByWord(char *sentence, char* word) { int i,cur; cur=strlen(word); while(inDelimiters(sentence[cur])) cur++; char *cut = (char*) malloc (strlen(sentence) - cur); for(i=cur;istrlen(sentence);i++) cut[i-cur]=sentence[i]; cut[i-cur]= '\0'; return cut; } ////////////////////////////////////////////////////////// int main() { char word [N]; int len = lenOfSentence(); //вводим текст, подсчитываем его длину char *sentence = veryLongString(len); //создаем строку с текстом printf("\nWords:\n"); //разбираем на слова while(strlen(sentence)>0) { sscanf(sentence,"%s",word); //считываем слово как набор символов до пробела if(inDelimiters(word[strlen(word)-1])) //если захватили и знак препинания справа word[strlen(word)-1] = '\0'; //убираем его printf("\t%s\n",word); strcpy(sentence,cutSentenceByWord(sentence,word)); //срезаем текст на найденное //слово слева } flushall(); getchar(); return 0; }

Извлечение подстрок из строки

В этой статье рассматриваются различные методы извлечения частей строки.

  • Используйте метод Split, если нужные подстроки разделены символом-разделителем (или символами).
  • Регулярные выражения удобно использовать, когда строка соответствует фиксированному шаблону.
  • Используйте сочетание методов IndexOf и Substring, если не хотите извлекать все подстроки из строки.

Метод String.Split

String.Split предоставляет несколько перегрузок, которые позволяют разбить строку на группу подстрок, основанных на одном или нескольких указанных символах-разделителях. Вы можете ограничить общее число подстрок в окончательном результате, обрезав пробелы в подстроках или исключив пустые подстроки.

Ниже показаны три различные перегрузки String.Split() . Первый пример вызывает перегрузку Split(Char[]) без передачи знаков разделения. Если не указать символы-разделители, String.Split() будет использовать для разделения строки разделители по умолчанию, которые являются пробелами.

string s = "You win some. You lose some."; string[] subs = s.Split(); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some. // Substring: You // Substring: lose // Substring: some. 
Dim s As String = "You win some. You lose some." Dim subs As String() = s.Split() For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some. ' Substring: You ' Substring: lose ' Substring: some. 

Как видите, символы-точки ( . ) содержатся в двух подстроках. Если вы хотите исключить символы-точки, добавьте символ-точку как дополнительный символ разделителя. В следующем примере показано, как это сделать.

string s = "You win some. You lose some."; string[] subs = s.Split(' ', '.'); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some // Substring: // Substring: You // Substring: lose // Substring: some // Substring: 
Dim s As String = "You win some. You lose some." Dim subs As String() = s.Split(" "c, "."c) For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some ' Substring: ' Substring: You ' Substring: lose ' Substring: some ' Substring: 

Точки исчезли из подстрок, однако теперь появились две дополнительные пустые подстроки. Пустые подстроки представляют подстроку между словом и точкой после него. Чтобы исключить из результирующего массива пустые подстроки, вызовите перегрузку Split(Char[], StringSplitOptions) и укажите StringSplitOptions.RemoveEmptyEntries для параметра options .

string s = "You win some. You lose some."; char[] separators = new char[] < ' ', '.' >; string[] subs = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some // Substring: You // Substring: lose // Substring: some 
Dim s As String = "You win some. You lose some." Dim separators As Char() = New Char() Dim subs As String() = s.Split(separators, StringSplitOptions.RemoveEmptyEntries) For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some ' Substring: You ' Substring: lose ' Substring: some 

Регулярные выражения

Если строка соответствует фиксированному шаблону, используйте регулярное выражение для извлечения и обработки ее элементов. Например, если строки принимают форму "номер операнда", можно использовать регулярное выражение для извлечения и обработки элементов строки. Приведем пример:

String[] expressions = < "16 + 21", "31 * 3", "28 / 3", "42 - 18", "12 * 7", "2, 4, 6, 8" >; String pattern = @"(\d+)\s+([-+*/])\s+(\d+)"; foreach (string expression in expressions) < foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(expression, pattern)) < int value1 = Int32.Parse(m.Groups[1].Value); int value2 = Int32.Parse(m.Groups[3].Value); switch (m.Groups[2].Value) < case "+": Console.WriteLine("= ", m.Value, value1 + value2); break; case "-": Console.WriteLine(" = ", m.Value, value1 - value2); break; case "*": Console.WriteLine(" = ", m.Value, value1 * value2); break; case "/": Console.WriteLine(" = ", m.Value, value1 / value2); break; > > > // The example displays the following output: // 16 + 21 = 37 // 31 * 3 = 93 // 28 / 3 = 9.33 // 42 - 18 = 24 // 12 * 7 = 84 
Dim expressions() As String = Dim pattern As String = "(\d+)\s+([-+*/])\s+(\d+)" For Each expression In expressions For Each m As Match In Regex.Matches(expression, pattern) Dim value1 As Integer = Int32.Parse(m.Groups(1).Value) Dim value2 As Integer = Int32.Parse(m.Groups(3).Value) Select Case m.Groups(2).Value Case "+" Console.WriteLine(" = ", m.Value, value1 + value2) Case "-" Console.WriteLine(" = ", m.Value, value1 - value2) Case "*" Console.WriteLine(" = ", m.Value, value1 * value2) Case "/" Console.WriteLine(" = ", m.Value, value1 / value2) End Select Next Next ' The example displays the following output: ' 16 + 21 = 37 ' 31 * 3 = 93 ' 28 / 3 = 9.33 ' 42 - 18 = 24 ' 12 * 7 = 84 

Шаблон регулярного выражения (\d+)\s+([-+*/])\s+(\d+) определяется следующим образом:

Расписание Description
(\d+) Совпадение с одной или несколькими десятичными цифрами. Это первая группа записи.
\s+ Совпадение с одним или несколькими пробелами.
([-+*/]) Совпадение со знаком арифметического оператора (+, -, *, или /). Это вторая группа записи.
\s+ Совпадение с одним или несколькими пробелами.
(\d+) Совпадение с одной или несколькими десятичными цифрами. Это третья группа записи.

Вы также можете использовать регулярное выражение для извлечения подстрок из строки на основе шаблона, а не фиксированного набора символов. Это распространенный сценарий, если происходит одно из следующих условий:

  • Один или несколько символов-разделителей не всегда служат разделителями в экземпляре String.
  • Последовательность и количество символов-разделителей являются изменяемыми или неизвестными.

Например, метод Split нельзя использовать для разделения следующей строки, поскольку число символов \n (новая строка) является изменяемым и они не всегда являются разделителями.

[This is captured\ntext.]\n\n[\n[This is more captured text.]\n] \n[Some more captured text:\n Option1\n Option2][Terse text.] 

Регулярное выражение может легко разделить эту строку, как показано ниже.

String input = "[This is captured\ntext.]\n\n[\n" + "[This is more captured text.]\n]\n" + "[Some more captured text:\n Option1" + "\n Option2][Terse text.]"; String pattern = @"\[([^\[\]]+)\]"; int ctr = 0; foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(input, pattern)) < Console.WriteLine(": ", ++ctr, m.Groups[1].Value); > // The example displays the following output: // 1: This is captured // text. // 2: This is more captured text. // 3: Some more captured text: // Option1 // Option2 // 4: Terse text. 
Dim input As String = String.Format("[This is capturedtext.]" + "[[This is more " + "captured text.]" + "[Some more captured text:" + " Option1" + " Option2][Terse text.]", vbCrLf) Dim pattern As String = "\[([^\[\]]+)\]" Dim ctr As Integer = 0 For Each m As Match In Regex.Matches(input, pattern) ctr += 1 Console.WriteLine(": ", ctr, m.Groups(1).Value) Next ' The example displays the following output: ' 1: This is captured ' text. ' 2: This is more captured text. ' 3: Some more captured text: ' Option1 ' Option2 ' 4: Terse text. 

Шаблон регулярного выражения \[([^\[\]]+)\] определяется следующим образом:

Расписание Description
\[ Совпадение с открывающей скобой.
([^\[\]]+) Совпадение с любым символом, который не является открывающей или закрывающей скобкой, один или несколько раз. Это первая группа записи.
\] Совпадение с закрывающей скобкой.

Метод Regex.Split практически идентичен методу String.Split, за исключением того, что он разделяет строку на основе шаблона регулярного выражения, а не фиксированной кодировки. Например, в следующем примере метод Regex.Split используется для разделения строки, которая содержит подстроки, разделенные с помощью различных сочетаний дефисов и других символов.

String input = "abacus -- alabaster - * - atrium -+- " + "any -*- actual - + - armoire - - alarm"; String pattern = @"\s-\s?[+*]?\s?-\s"; String[] elements = System.Text.RegularExpressions.Regex.Split(input, pattern); foreach (string element in elements) Console.WriteLine(element); // The example displays the following output: // abacus // alabaster // atrium // any // actual // armoire // alarm 
Dim input As String = "abacus -- alabaster - * - atrium -+- " + "any -*- actual - + - armoire - - alarm" Dim pattern As String = "\s-\s?[+*]?\s?-\s" Dim elements() As String = Regex.Split(input, pattern) For Each element In elements Console.WriteLine(element) Next ' The example displays the following output: ' abacus ' alabaster ' atrium ' any ' actual ' armoire ' alarm 

Шаблон регулярного выражения \s-\s?[+*]?\s?-\s определяется следующим образом:

Расписание Description
\s- Совпадение с пробелом, за которым следует дефис.
\s? Совпадение с нулем или одним символом пробела.
[+*]? Совпадение с нулем или единичное появление символа + или *.
\s? Совпадение с нулем или одним символом пробела.
-\s Совпадение с дефисом, за которым следует пробел.

Методы String.IndexOf и String.Substring

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

  • IndexOf, возвращающий отсчитываемый от нуля индекс первого появления символа или строки в экземпляре строки.
  • IndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки первого появления любого символа в массиве символов.
  • LastIndexOf, возвращающий отсчитываемый от нуля индекс последнего появления символа или строки в экземпляре строки.
  • LastIndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки последнего вхождения любого символа в массиве символов.

В следующем примере метод IndexOf используется для поиска точек в строке. После чего в нем используется метод Substring для возврата полных предложений.

String s = "This is the first sentence in a string. " + "More sentences will follow. For example, " + "this is the third sentence. This is the " + "fourth. And this is the fifth and final " + "sentence."; var sentences = new List(); int start = 0; int position; // Extract sentences from the string. do < position = s.IndexOf('.', start); if (position >= 0) < sentences.Add(s.Substring(start, position - start + 1).Trim()); start = position + 1; >> while (position > 0); // Display the sentences. foreach (var sentence in sentences) Console.WriteLine(sentence); // The example displays the following output: // This is the first sentence in a string. // More sentences will follow. // For example, this is the third sentence. // This is the fourth. // And this is the fifth and final sentence. 
 Dim input As String = "This is the first sentence in a string. " + "More sentences will follow. For example, " + "this is the third sentence. This is the " + "fourth. And this is the fifth and final " + "sentence." Dim sentences As New List(Of String) Dim start As Integer = 0 Dim position As Integer ' Extract sentences from the string. Do position = input.IndexOf("."c, start) If position >= 0 Then sentences.Add(input.Substring(start, position - start + 1).Trim()) start = position + 1 End If Loop While position > 0 ' Display the sentences. For Each sentence In sentences Console.WriteLine(sentence) Next End Sub ' The example displays the following output: ' This is the first sentence in a string. ' More sentences will follow. ' For example, this is the third sentence. ' This is the fourth. ' And this is the fifth and final sentence. 

См. также

  • Базовые операции со строками в .NET
  • Регулярные выражения .NET
  • Анализ строк с помощью String.Split в C#

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

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

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