Почему в случае ch = 3
в case игнорируется строка gets_s(text, 150)
?
То есть при срабатывании этого case
программа не дает возможности ввести text
.
Текст заголовочного файла listcls.h:
#pragma once
#include <iostream>
using namespace std;
class listcls
{
private:
typedef struct snd /* структура элемента хранения */
{
char str[10]; /* элемент списка, массив символов */
snd *n; /* указатель на элемент хранения */
} ListString;
snd* fs; //указатель на первый элемент списка
snd* ls; //указатель на последний элемент списка
int count; //счетчик элементов списка
void initList(char *text); //функция для создания списка
public:
listcls(char *text); //конструктор по созданию связного списка
~listcls(); //деструктор списка
void changeList(char *text); //метод для переопределения списка
int lenght(); //метод определения длины строки списка
char* initArray(); //метод для выделения динамического массива под список и внесение его в этот массив
void show(); //метод отображения строки списка на экран
int find(char *arr, char* tar); //метод, реализующий функцию, осуществляющую поиск заданной подстроки в строке списка
};
Текст listcls.cpp
#include "pch.h"
#include "listcls.h"
#include <string.h>
using namespace std;
void listcls::initList(char* text) {
int i = 0, j = 0; //переменные-счетчики для указателей на элемент строки и на сами строки
ListString* s = new ListString; //объявление массива указателей на структуру
fs = s; //начинаем с первого символа
while (text[i] != '\0') //пока не стартим конец стркои
{
s->str[j] = text[i]; //присвоение указателю значения
i++;
j++;
if (i % 10 == 0) //конец элемента списка
{
j = 0;
s->n = new ListString; //переход к новому элементу
s = s->n;
}
}
s->str[j] = '\0'; //указатель на конец строки
s->n = nullptr;
count = i; //запись в значение счетсчика количества элементов списка
}
listcls::listcls(char* text) {
initList(text); //вызов метода создания списка
}
listcls::~listcls() {
while (fs != NULL) {
snd* n = fs->n;
delete fs;
fs = n;
}
}
void listcls::changeList(char* text) {
this->~listcls(); //удаление старого списка
initList(text); //создание нового списка
}
int listcls::lenght() {
return count; //отображение длины строки списка
}
char* listcls::initArray() {
int n = lenght(); //размер массива - длина строки списка
char* arr = new char[n + 1]; //выделение места для массива. "+ 1" - для нуль-терминатора
int i = 0; //счетчик
ListString* ns = fs; //начинаем с первого элемента
while (ns != nullptr) //пока не последний узел списка
{
for (int j = 0; j < 10; j++) {
if (ns->str[j] == '\0') //пока не встретим конец строки
{
break; //досрочный выход из цикла при окончании строки
} else {
arr[i] = ns->str[i]; //заполнение массива символами из строки списка
i++;
}
}
ns = ns->n;
}
arr[i] = '\0'; //конец строки
return arr; //возврат указателя на массив
}
void listcls::show() {
ListString* ns = fs;
while (ns != nullptr) // пока не последний узел
{
for (int i = 0; i < 10; i++) // обход узла заполняем массив символами из узла
{
if (ns->str[i] == '\0') //пока не встретим конец строки
{
break; //досрочный выход из цикла при окончании строки
} else {
std::cout << ns->str[i]; //выводим символы из текущего элемента списка на экран
}
}
ns = ns->n;
}
}
int listcls::find(char* arr, char* tar) {
int count1 = strlen(tar); //определение длины искомой строки
int j = 0, check1 = 0, check2 = 0, res; /*j - счетчик для элементов искомой строки, check1 - проверка на свопадение элемента,
check2 - фиксация факта наличия подстроки в строке, res - вывод результата */
arr = initArray(); //получение указателя на массив
for (int i = 0; i < lenght(); i++) //перебор исходной строки
{
j = 0;
check1 = 0;
while (j < count1) {
if (tar[j] == arr[j + i]) //сравнение элементов строк
{
check1++; //счетчик успешных сравнений
}
j++;
}
if (check1 == count1) //если найдена подстрока
{
check2 = 1;
res = i; //номер первого элемента подстроки в исходной строке
break; //досрочный выход из цикла
}
}
if (check2 == 0) //подстрока не найдена
{
res = -1;
}
return res;
}
Файл main.cpp:
#include "pch.h"
#include <iostream>
#include "listcls.h"
#include <string.h>
using namespace std;
int main() {
int a = 1;
setlocale(LC_ALL, "Russian");
char* text = new char[150];// переменная для ввода текста с консоли
std::cout << "Введите текст: ";
gets_s(text, 150);
char* tar = new char[150];
cout << "Введите искомую подстроку: ";
gets_s(tar, 150);
listcls list(text);
std::cout << "Выберите действие:" << endl << "1 - Вывести список на экран" << endl
<< "2 - Показать длину списка" << endl << "3 - Переопределить список" << endl
<< "4 - Поиск подстроки" << endl << "5 - Выйти" << endl;
int ch;
start:
cin >> ch;
if (ch == 3) {
cout << "Введите новый текст: ";
gets_s(text, 150);
list.changeList(text);
}
switch (ch) {
case 1:
list.show();
break;
case 2:
cout << list.lenght() << endl;
break;
/*case 3: {
cout << "Введите новый текст: ";
gets_s(text, 150);
list.changeList(text);
}; break;*/
case 4:
cout << list.find(text, tar);
break;
case 5:
list.~listcls();
break;
default:
cout << "Неверный ввод";
}
if (ch == 5) {
delete[] text;
return 0;
}
goto start;
}
Просто после
cin >> ch;
в буфере остается несчитанный \n
. Вопрос многократно рассмотрен, см., например, тут.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Почему отладчик превращает 'e' в 'H'? тексты программы: case игнорирует ввод строки Спасибо
Собственно в названии вопроса и проблемаУ меня есть несколько классов
Собственно говоря, суть моего вопроса можно свести к следующему: почему мы в обязательном порядке должны присваивать начальное значение...