Необходима помощь с кодом по задаче со строками(C#)
Дана следующая задача: Дана строка, в которой содержится осмысленной текстовое сообщение. Слова сообщения разделяется пробелами и знаками препинания. Удалить из сообщения все слова, содержащие данный символ (без учета регистра)
Ниже приведён код, в котором компилятор видит ошибку в цикле foreach, которую я не до конца понимаю как решить, а именно он не может преобразовать char(понятия не имею где он его увидел) в string.
Что конкретно требуется:
подсказать как решить ошибку с циклом
подсказать как модифицировать код для удаления слова полностью, а не буквы(на случай если я что-то напутал и код удаляет только букву)
Console.WriteLine("Программа, удаляющая слова, с заданной буквой.");
Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
string words = Console.ReadLine();
StringBuilder tagsSB = new StringBuilder(text);
foreach (string word in words)
{
tagsSB.Replace(word, "");
}
Console.WriteLine(tagsSB.ToString());
Console.WriteLine();
Console.Write("Нажмите Enter для выхода.");
Console.ReadLine();
Ответы (2 шт):
Если применять цикл foreach
к строке, то он будет пробегаться по каждому символу строки, то есть по char
и соответственно тип каждого элемента должен быть char
. Конструкцией string word
вы пытаетесь принудить конвертировать символ в строку, а он не может.
Получается, либо надо писать char word
, чтобы всё же пробегаться по символам, как и требуется для строки, либо (т.к. задача всё же в пробегании по словам), нужно, чтобы words
был не строкой, а массивом строк. Т.е. либо разбить words
предварительно на слова, например, с помощью функции Split
, записать этот массив в переменную и уже эту переменную подставить в цикл. Либо прям сразу в цикле написать не words
, а words.Split(НУЖНОЕ ВЫРАЖЕНИЕ)
string
это по сути массив char[]
. Поэтому по символам строки можно пробежаться циклом или взять символ по индексу.
Чтобы решить задачу, words
должен быть массивом слов (строк) string[]
.
Решение будет выглядеть примерно так
Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
char letter = Console.ReadLine()[0]; // первый символ строки
StringBuilder tagsSB = new StringBuilder(text);
string[] words = text.Split();
foreach (string word in words)
{
if (word.Contains(letter, StringComparison.CurrentCultureIgnoreCase))
{
tagsSB.Replace(word, "");
}
}
Console.WriteLine(tagsSB);
Это если опираться на ваш код как основу. Но есть проблема, будут оставаться парные пробелы на местах удаления строк, так как слово удаляется, а пробел рядом с ним - нет.
Но я бы написал через список как-то так
Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
char letter = Console.ReadLine()[0]; // первый символ строки
string[] words = text.Split();
List<string> newWords = new();
foreach (string word in words)
{
if (!word.Contains(letter, StringComparison.CurrentCultureIgnoreCase))
{
newWords.Add(word);
}
}
string result = string.Join(' ', newWords);
Console.WriteLine(result);