Почему не работает функция gets? - C (СИ)
Формулировка задачи:
Почему не работает функция gets?
Visual Studio
// ConsoleApplication6.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
int OnlyNumber(char*); /* прототип функции */
void main()
{ char s[80]=""; /* буфер строки */
int Num; /* */
char c; /* ответ, на вопрос о продолжении работы */
do
{
printf("\nВведите исходную строку: ");
gets(s);
Num = OnlyNumber(s);
printf("Количество слов,состоящих только из цифр: %d", Num);
printf("\nПродолжить ? (Y/N)[Y]:");
}
while (!((c = getch()) == 'N' || c == 'n'));
}/* main */
int OnlyNumber(char* s)
{
char *ss;
int count = 0, d = 0;
for (ss = s; *ss != '\0'; ss++)
if (*ss >= 48 && *ss <= 57) count++;
else
if (*ss == ' ' && count != 0)
{
d++;
count = 0;
}
else count = 0;
return(d);
}/* OnlyNumber */Решение задачи: «Почему не работает функция gets?»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
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 */
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
- #include
для работы с функциями ввода-вывода - #include
для работы со строками - #include
для работы с преобразованием символов
- #include
- Прототип функции:
- *int OnlyNumber(char);** функция, которая принимает указатель на строку и возвращает количество слов, состоящих только из цифр
- Основная функция программы:
- *int main(int argc, char argv[])**
- Объявлена переменная char s[80], которая будет использоваться как буфер для ввода строки
- Объявлена переменная int Num, которая будет использоваться для хранения количества слов, состоящих только из цифр
- Объявлена переменная char c, которая будет использоваться для хранения ответа на вопрос о продолжении работы
- Используется цикл do-while для повторения ввода и обработки строки до тех пор, пока пользователь не введет 'N' или 'n'
- Внутри цикла происходит вывод сообщения с просьбой ввести исходную строку
- Функция gets(s) используется для считывания строки из стандартного ввода
- Результат работы функции OnlyNumber(s) выводится на экран
- Происходит считывание символа ответа с помощью функции getchar()
- Используется функция clean_stream() для очистки буфера ввода
- Функция clean_stream():
- Очищает буфер ввода, считывая символы до новой строки
- *Функция OnlyNumber(char)**:
- Переменная fwnum инициализируется значением 0 и используется для подсчета слов, начинающихся с цифры
- Переменная first инициализируется значением 1 и используется для определения первого слова в строке
- Переменная cwnum инициализируется значением 0 и используется для подсчета слов, состоящих только из цифр
- Происходит проход по каждому символу входной строки
- Если символ является буквой или цифрой, то проверяется, является ли он первым символом в слове
- Если символ является пробелом, переносом строки или концом строки, то проверяется, является ли текущее слово словом, состоящим только из цифр
- Возвращается количество слов, состоящих только из цифр
- В конце программы возвращается значение 0, что означает успешное завершение работы программы