Перейти к содержимому

Почему не работает gets c

  • автор:

Функция gets в языке С. Почему посимвольное сравнение не работает?

На этапе посимвольного сравнения программа выдаёт ошибку. Что делать?

#include #include int main() < char sim1, sim2, n; bool ni = false; //открываем текстовые файлы// FILE *txt1; txt1=fopen("txt.txt","r"); FILE *txt2; txt2=fopen("txt2.txt","r"); FILE *txt3; txt3=fopen("txt3.txt","w"); //тестим на предмет их наличия// if (!txt1 || !txt2 == NULL) < printf ( "I can't open a file for reading \n" ); return 1; >if(!txt3==NULL) < printf( "I can't open a file for writing \n"); return 1; >printf ( "txt1 and txt2 files are open \n"); // посимвольно сравниваем txt1 и txt2// while(txt1 && txt2) < txt1=fgets(sim1); txt2=fgets(sim2); if(sim1 == sim2) fputc(sim1,txt3); else ni = true; >if(ni==false) < // сообщение о успехе printf ( "The file contents are identical \n" ); >else < // Если посимвольное сравнение не увенчалось успехом printf ( "The contents of the files are not identical \n" ); >// закрываем файлы fclose(txt1); fclose(txt2); fclose(txt3); printf ( "End of program" ); return 0; >
  • Вопрос задан более трёх лет назад
  • 230 просмотров

Комментировать
Решения вопроса 2

Что тут вообще написано?

Сначала txt1 — это FILE*. Потом зачем-то txt1=fgets(sim1), то есть в переменную типа FILE* присваивается что? Советую посмотреть описание fgets в документации:

char *fgets(char *s, int size, FILE *stream);

Присваивается char*. А откуда, из какого файла?

Думаю, имелось в виду:

Тогда это имеет какой-то смысл.

Далее, while по txt1 && txt2 не имеет смысла — указатели будут ненулевыми даже когда будет достигнут конец файлов. Правильнее обернуть в такой цикл:

В конце проверить, что feof(txt1) && feof(txt2), иначе один из файлов закончился, а второй нет — размеры не совпадают, файлы отличаются.

А более правильно делать блочное чтение, с помощью fread и memcmp, это гораздо эффективнее по скорости (да, конечно, для мелких файлов разница незаметна, но всё же):

int isequal=1; while(!feof(txt1) && !feof(txt2)) < char buf1[1024]; char buf2[1024]; int readsize1 = fread(buf1, 1, 1024, txt1); int readsize2 = fread(buf2, 1, 1024, txt2); if (readsize1 != readsize2) < isequal=0; break; >else < if (memcmp(buf1, buf2, readsize1)) < isequal=0; break; >> if(isequal) < // одинаковы >else < // отличаются >

Почему не работает функция gets?

Почему в devc++ не работает функция COLOR()
Помогите пожалуйста. В учебнике сказано, что цвет можно задавать функцией COLOR(255,255,255). Пишу.

Почему не работает функция?
Вот понадобилась функция для взятия остатка от деления нецелых чисел написал такую: long double.

Почему не работает функция?
Пытаюсь получить код символа через такую функцию: function Ords(S: string):integer; var i.

1778 / 756 / 153
Регистрация: 03.06.2009
Сообщений: 5,894

Не проверял, но подозреваю перез gets не полностью очищается входной поток.
Попробуйте перед gets добавить

fflush(stdin);

5496 / 4891 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

ЦитатаСообщение от Ksenia_G Посмотреть сообщение

Почему не работает функция gets?
Уверены? Как определили?
Регистрация: 31.03.2014
Сообщений: 34

После сборки решения ошибка:error C4996: ‘gets’: This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1778 / 756 / 153
Регистрация: 03.06.2009
Сообщений: 5,894
Это просто предупреждение, что функция может быть небезопасной.
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2

Лучший ответ

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

Решение

После использования c = getchar() необходимо очистить буфер. Например так — clean_stream().
Помимо этого ваш алгоритм неустойчив к строкам типа «adsfdafa12131» — он их тоже считает как числа.
А также, если последнее слово было числом он его отбрасывает (например, 123 1232 31231 — будет посчитано 2 вместо 3)

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
#include #include #include int OnlyNumber(char*); /* прототип функции */ void clean_stream(); int main(int argc, char *argv[]) { char s[80]; /* буфер строки */ int Num; /* */ char c; /* ответ, на вопрос о продолжении работы */ do { printf("\nВведите исходную строку: "); gets(s); Num = OnlyNumber(s); printf("Количество слов,состоящих только из цифр: %d", Num); printf("\nПродолжить ? (Y/N)[Y]: "); c = getchar(); clean_stream(); } while (c != 'N' && c != 'n'); return 0; }/* main */ void clean_stream() { while(fgetc(stdin) != '\n'); } int OnlyNumber(char *s) { int fwnum = 0; int first = 1; int cwnum = 0; int len = strlen(s); for(int i = 0; i  len; ++i) { if(isalnum(s[i])) { if(first) { first = 0; if(isdigit(s[i])) { fwnum = 1; } } if(isalpha(s[i])) { if(fwnum) { fwnum = 0; } } } else if(isspace(s[i]) || s[i] == '\n' || s[i] == '\0') { if(fwnum) { ++cwnum; fwnum = 0; } first = 1; } } return cwnum; }/* OnlyNumber */

проблема с функцией gets()

Из-за чего могут быть проблемы с функцией gets() ? Тестирующая система выдает такую ошибку: Content-type: text/xml 45a5b2ff-e647-482e-b475-39768bf61a7e 003839.cpp: In function ‘int main()’: 003839.cpp:17:16: error: ‘gets’ was not declared in this scope while (gets(s)) ^ Так выглядит часть моего кода, где используется gets()

int main() < const char* sep = ". -,;() \t\n"; ifstream file; file.open("input.in"); file.open("output.out"); while (gets(s)) < if (!s[0]) break; // >

Отслеживать
задан 2 янв 2018 в 9:39
Julia Ponomareva Julia Ponomareva
305 4 4 серебряных знака 15 15 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Неплохо бы посмотреть весь код. Наверное, забыли нужный #include — stdio.h — или компилятор из свежайших, в котором эту функцию уже выбросили.

В любом случае, использовать gets крайне не рекомендуется. Замените на gets_s .

Отслеживать
ответ дан 2 янв 2018 в 9:53
12.4k 2 2 золотых знака 18 18 серебряных знаков 43 43 бронзовых знака
gets_s не обязателен для реализации. Замена gets — fgets.
2 янв 2018 в 9:58
вот весь код pastebin.com/tgrA4YG4, stdio.h был подключен
2 янв 2018 в 10:01

Это не тот код — по ссылке у вас fgets , а не gets ! Вы случаем не Visual C++ 2015 или 2017 компилируете? Если заменить fgets на gets — да, эти компиляторы не компилируют — потому что gets из стандарта давно выброшен. А вот VC++ 2010 спокойно компилирует — предупреждая о небезопасности.

2 янв 2018 в 12:03

Я просто поменяла на gets. У меня dev c++, всё компилируется, но на информатиксе (тест. система) выдает ошибку

2 янв 2018 в 12:27

Функция gets была удалена в стандарте C++14 из за ее крайней небезопасности. Она подвержена проблеме переполнения буфера, так как размер буфера в ней никак не указывается. Используйте ::std::string s в качестве буфера и file >> s для чтения. Кроме того, после записи file.open(«output.out»); чтение будет производится из файла output.txt .

Отслеживать
ответ дан 2 янв 2018 в 10:22
user7860670 user7860670
29.6k 3 3 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков

Не могли бы Вы проиллюстрировать на моем коде? Не очень понимаю, как интегрировать данную конструкцию

Почему не работает gets c

Почему вот в таком коде:

#include #include #include using namespace std; int main() < short x; char s[100]; cin >> x; gets(s); cout

после считывания переменной x не работает функция gets()? При этом в итоге выводится пустая строка s.

Последний раз редактировалось merax; 29.07.2008 в 06:37 .
Меркантильный кю
Участник клуба
Регистрация: 02.02.2008
Сообщений: 1,001
Когда ты вот здесь

cin >> x;

вбиваешь число и щёлкаешь Энтер, считывается только число, а символ перевода строки остаётся в буфере клавиатуры. Функция же gets() считывает как раз до этого символа, поэтому в твоей строке есть только символ перевода строки
Как вариант, вызывай перед gets getchar(). Или можно ввод x организовать по-другому

Росли вроде умными, выросли дурнями. (c)А.Васильев

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

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