Доброго времени суток.
Нужна помощь.
Написал программу с использованием функции fgets(). Как известно, больше определенного количества она символы не выдает.
Так вот, fgets(str, 10, stdin); выдает на экран только 9 символов (10-й \0). Но у меня и дальше в программе присутствует функция fgets. Если я ввожу больше 9 символов, они записываются в буфер и выдаются при вызове функции fgets в следующий раз, хотя должен вводить эти символы с клавиатуры. Как очистить этот буфер. Испробовал разные функции, ничего не помогает. fflush(stdin) не работает. Ничего не работает.
Вот код (он ещё не завершен, но на этом этапе в цикле выдает значения из буфера):
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
#include <time.h>
int main (){
setlocale(LC_ALL, «Russian»);
srand(time_t(0));
char str[10];
int sch;
int count;
while (1) { // с 17 по 44 строку защита от «дурака» для размерности
count = 0;
sch = 0;
printf(«Введите размерность матрицы \n»);
fgets(str, 10, stdin);
for (int i = 0; i < 9; i++) {
if (str == '\0\′) {
sch = 1;
}
}
if (sch == 1) {
//printf(«%s», str);
}
else if (sch == 0) {
//printf(«%s\n», str);
//printf(«I’m sorry \n»);
}
//printf(«%i \n», strlen(str)); Длинна строки с \0
for (int i = 0; i < (strlen(str)-1); i++) {
if (isdigit(str)) {
count = count + 1;
}
else { printf(«ERROR!!! \n»); return 1; }
}
if (count = (strlen(str)-1)) { break; }
} //Конец проверки для размерности
int n = atoi(str);
printf(«Размерность матрицы = %i \n», n);
printf(«Введите диапазон данных для элемента матрицы \n»);
printf(«Левый край \n»);
while (1) { // с 52 по 86 строку защита от «дурака» для диапазона данных min
count = 0;
sch = 0;
fgets(str, 10, stdin);
for (int i = 0; i < 9; i++) {
if (str == '\0\′) {
sch = 1;
}
}
if (sch == 1) {
//printf(«%s», str);
}
else if (sch == 0) {
//printf(«%s\n», str);
//printf(«I’m sorry \n»);
}
//printf(«%i \n», strlen(str)); Длинна строки с \0
for (int i = 0; i < (strlen(str) — 1); i++) {
if (i == 0) {
if (str == '-’) {
count = count + 1;
continue;
}
}
if (isdigit(str)) {
count = count + 1;
}
else {
printf(«ERROR!!! Программа завершается \n»); return 1;
}
}
if (count = (strlen(str) — 1)) { break; }
}
//Конец проверки min
int min = atoi(str);
printf(«Левый барьер = %i \n», min);
printf(«Правый край \n»);
while (1) { // с 93 по 127 строку защита от «дурака» для диапазона данных max
count = 0;
sch = 0;
fgets(str, 10, stdin);
for (int i = 0; i < 9; i++) {
if (str == '\0\′) {
sch = 1;
}
}
if (sch == 1) {
//printf(«%s», str);
}
else if (sch == 0) {
//printf(«%s\n», str);
//printf(«I’m sorry \n»);
}
//printf(«%i \n», strlen(str)); Длинна строки с \0
for (int i = 0; i < (strlen(str) — 1); i++) {
if (i == 0) {
if (str == '-’) {
count = count + 1;
continue;
}
}
if (isdigit(str)) {
count = count + 1;
}
else {
printf(«ERROR!!! Программа завершается \n»); return 1;
}
}
if (count = (strlen(str) — 1)) { break; }
} //Конец проверки max
int max = atoi(str);
printf(«Правый барьер = %i \n», max);
if ((max — min) <= 0) {
printf(«Ошибка, max > min!!! Программа завершается \n»);
return 1;
}
int *a = new int [n];
for (int i = 0; i<n; i++) {
a = new int[n];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[j] = (rand() % (max — min + 1) + min);
}
}
printf(«Матрица А \n»);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf(«%i », a[j]);
}
printf(«\n»);
}
for (int i = 0; i<n; i++) {
delete[] a;
}
delete[] a;
return 0;
}
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Люююююди. Если вы ждёте разумного ответа — сделайте так, чтобы вопрос можно было хотя бы читать (кнопочка «code» в редакторе — с значком «<>» на листе).
Ну а теперь поехали:
— это что должно было значить? может всё-таки вот так?
Как убрать лишние символы после 10 — например, читать символы до тех пор, пока не наступит конец строки во входном буфере, например так:
PS. Код с экрана по сути не читаем. Теги [ code ] и astyle/clang-format/любой форматировщик кода в помощь
PPS. Это явно лабораторная работа и для полноценного понимания, почему так делается — хотелось бы видеть полное задание. Потому, что первый же пример с fgets, правильнее решается с использованием scanf.
PPS2. Если это C — тогда malloc() и free(). delete и new — это уже c++.
Извиняюсь за предоставленные трудности, в первый раз на форуме. Учту это. А само задание вот:
Дана квадратная матрица A порядка n. Получить матрицу (А-E)2+C2, где E — единичная матрица порядка n, а элементы
матрицы C вычисляются по формуле C(ij)= (sgn(i-j)) / (i+j+1).
Мне решение само не нужно, его я в целом знаю. Проблема возникла с так называемой «защитой от дурака».
Про fgetc() почитаю, спасибо за вектор в котором стоит думать.
Так зачем тогда fgets() для ввода параметров? Есть scanf (http://en.cppreference.com/w/c/io/fscanf )
Мне нужно выполнить защиту. Я решил через строку, проверяя каждый символ. Если находит хоть одну букву, кавычку и т.д. кроме тире(минус) первым символом, то выдает ошибку и закрывает программу. Потом строку из цифр преобразую функцией atoi() в число типа int. Проблема в том, что при вводе строки нужно знать изначальное количество цифр в ней, но я могу ввести как 12, так и 1436. А количество цифр в них разное. Брать с запасом, тогда лишняя память и тоже можно ввести число, цифр в котором больше указанного количества. (Да на этом уровне память не так важна, но всё равно, от нас требуют как можно меньше памяти использовать). Вот я и решил с помощью fgets() хотя бы ограничить количество символов, превышая которое строка просто обрезается. Но остается «хвост» в буфере. Вот у меня и дилемма. (Я только начинаю в этом деле, буквально месяц с небольшим, поэтому и возникают трудности. Я знаю ещё ДАЛЕКО не всё)
Поиграйтесь вот с этим кусочком. В коде возврата scanf есть количество успешно считанных переменных.
Этот блок вполне справляется с проверкой на мусор.
Хорошо, большое вам спасибо за помощь.
Извиняюсь опять. Здесь та же песня. Если я ввожу, например «34аываы», то он выдает только 34. Если же я ещё раз потом вставляю scanf, то туда записывается этот хвост. У меня там такая же проверка, где я должен ввести число с клавиатуры, но на деле я ничего не могу ввести, сразу выводится «Epic fail, conversion failed»