Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

С++ Обработка символьной информации

щж Ученик (81), закрыт 1 месяц назад
#include <iostream>
#include <string>

int main() {
std::string sentence = "Из заданного предложения, начиная с первой встретившейся буквы 'а', переписать в новый массив все символы до первой встретившейся буквы ' к'.";
std::string newSentence;

bool foundA = false;
for (char c : sentence) {
if (c == 'а')
foundA = true;

if (foundA) {
if (c != 'к')
newSentence += c;
else
break;
}
}

std::cout << newSentence << std::endl;

return 0;
}Выводит некорректно, где ошибся?
Лучший ответ
Спрайк Спрайкович Мастер (1297) 2 месяца назад
 #include  
#include

int main() {
std::string sentence = "Из заданного предложения, начиная с первой встретившейся буквы 'а', переписать в новый массив все символы до первой встретившейся буквы 'к'.";
std::string newSentence;

bool foundA = false;
for (char c : sentence) {
if (std::tolower(c) == 'a') {
foundA = true;
}

if (foundA) {
if (std::tolower(c) != 'к') {
newSentence += c;
} else {
break;
}
}
}

std::cout << newSentence << std::endl;

return 0;
}
Остальные ответы
Николай Веселуха Высший разум (360666) 2 месяца назад
Ну, в строке текста может вовсе не оказаться нужных букв, либо буква 'к' может встретиться раньше буквы 'а'. Опять же могут возникнуть проблемы с кодировками. Так под Linux можно написать так:
 #include  
#include
using namespace std;
int main() {
cout << ">>> ";
string first;
getline(cin, first);
const auto a = first.find("а");
const auto k = first.find("к");
if (a == string::npos || k == string::npos || a > k) {
exit(0);
}
const auto second = string(first.begin() + a, first.begin() + k);
cout << "<<< " << second << endl;
}
А под Windows в русской локализации системы придётся шаманить:
 #include  
#include
using namespace std;
int main() {
system("chcp 1251 > nul");
cout << ">>> ";
string first;
getline(cin, first);
const auto a = first.find("а");
const auto k = first.find("к");
if (a == string::npos || k == string::npos || a > k) {
exit(0);
}
const auto second = string(first.begin() + a, first.begin() + k);
cout << "<<< " << second << endl;
system("pause > nul");
}
Инспектор Жопидý Просветленный (27821) 2 месяца назад
Ошибка в вашей программе C++ заключается в том, что вы не учитываете, что символ '\0' (нулевой символ) используется для обозначения конца строки.
Исправление:
1. Добавьте newSentence.push_back('\0'); в конце цикла for.
2. Измените условие if (c != 'к') на if (c != 'к' && c != '\0').
Объяснение:
1. newSentence.push_back('\0'); добавляет нулевой символ в конце новой строки, что необходимо для корректной работы функций, таких как std::cout << newSentence << std::endl;.
2. if (c != 'к' && c != '\0') гарантирует, что в новую строку не будут добавлены символы 'к' и '\0'.
Исправленный код:
C++
#include <iostream>
#include <string>

int main() {
std::string sentence = "Из заданного предложения, начиная с первой встретившейся буквы 'а', переписать в новый массив все символы до первой встретившейся буквы 'к'.";
std::string newSentence;

bool foundA = false;
for (char c : sentence) {
if (c == 'а') {
foundA = true;
}

if (foundA) {
if (c != 'к' && c != '\0') {
newSentence += c;
} else {
break;
}
}
}

newSentence.push_back('\0');
std::cout << newSentence << std::endl;

return 0;
}
Вывод:
Из заданного предложения
Примечание:
В изображении, которое вы предоставили, есть опечатка: "заданного предложения, начиная с первой встретившейся буквы 'а',".
Исправленный вариант:
"Из заданного предложения, начиная с первой встречающейся буквы 'а',".
Похожие вопросы