Заголовочный файл conio.h
и getch()
не являются частью стандарта C, и вам, вероятно, следует избегать их использования.
См. Почему getch не переносим? и Почему необходимомы воздерживаемся от использования conio.h?Является ли он устаревшим? .
Кажется, что ваш цикл продолжается до тех пор, пока пользователь не введет слово длины ровно 4. Нет необходимости использовать для него отдельную переменную, такую как finish
.Просто используйте оператор break
.
т.е. вместо
if (strlen(word) == 4)
{
finish++;
}
do
if (strlen(word) == 4)
{
break;
}
, и вы можете избавиться от этой finish
переменной.
scanf()
ожидает указатели на буферы, где отсканированный ввод необходимо сохранить в качестве параметров после строки формата.С
scanf("%s", &word);
вы даете указатель на указатель, так как word
сам является указателем, так как имена массивов в C распадаются на указатели на их первый элемент.Таким образом, word
сам по себе указывает на первый символ, сохраненный в массиве word[]
.
Используйте взамен
scanf("%19s", &word);
.19 - спецификатор ширины.19 был выбран, поскольку размер word
равен 20
, и нам нужно 1
символьное пространство для хранения \0
, обозначающего конец строки.Это может помочь избежать переполнения буфера.
Вы также можете проверить возвращаемое значение scanf()
.Возвращает количество успешных заданий, таких как
if( scanf("%19s", &word)!=1 ) {
//Something went wrong.
}
См. Что произойдет, если я использую «&» со строкой в функции scanf? .
Использованиеfflush()
on stdin
приводит к неопределенному поведению в C, так как он предназначен для использования только в выходных потоках.См. Использование fflush (stdin) .
strcmp()
просто возвращает отрицательное число, если первый аргумент меньше второго, и положительное число, еслиПервый аргумент больше, чем другой.Эти цифры могут быть чем угодно.Вам не нужно сохранять возвращаемое значение strcmp()
.
Так что вместо
if (strcmp(word, smallest_word)<smallest)
{
strcpy(smallest_word, word);
smallest = strcmp(word, smallest_word);
}
if (strcmp(word, largest_word) > longest)
{
strcpy(largest_word, word);
longest = strcmp(word, largest_word);
}
do
if (strcmp(word, smallest_word) < 0)
{
strcpy(smallest_word, word);
}
if (strcmp(word, largest_word) > 0)
{
strcpy(largest_word, word);
}
Итак, вы можете изменить программудо
char word[20], smallest_word[20], largest_word[20];
for(int count=0; ; ++count)
{
printf("enter word:");
scanf("%19s", word);
if (count == 0)
{
strcpy(smallest_word, word);
strcpy(largest_word, word);
}
if (strcmp(word, smallest_word) < 0)
{
strcpy(smallest_word, word);
}
if (strcmp(word, largest_word) > 0)
{
strcpy(largest_word, word);
}
if (strlen(word) == 4)
{
break;
}
}
printf("smallest word: %s\n", smallest_word);
printf("largest word: %s\n", largest_word);