сортировка строк по величине и наименьшему - PullRequest
0 голосов
/ 19 июня 2019

Я не могу заставить программу правильно сортировать строки по наибольшим и наименьшим из всех вводимых пользователем данных

У меня проблемы с операторами if и тем, как они записывают самые маленькие и самые большие

#include <stdio.h>
#include <string.h>
#include <conio.h>

int main()
{
int finish = 0, longest=0, smallest=0, count =0;
char word[20], smallest_word[20], largest_word[20];
while (0 == finish)
{
    printf("enter word:");
    fflush(stdin);
    scanf("%s", &word);
    if (count == 0)
    {
        strcpy(smallest_word, word);
        strcpy(largest_word, word);
    }


    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);

    }


    if (strlen(word) == 4)
    {
        finish++;
    }
    count++;
}
printf("smallest word: %s\n", smallest_word);
printf("largest word: %s\n", largest_word);

getch();
return 0;
}

программа запускается просто неправильно записывает самые большие и самые маленькие значения

Ответы [ 4 ]

1 голос
/ 19 июня 2019

У вашей логики и синтаксиса есть некоторые проблемы.

Здесь strcmp (src, dst) возвращает 0, если обе строки совпадают, либо некоторое положительное или отрицательное число, когда src> dst и dst> src соответственно.

А для scanf () нужен адрес переменной, а само имя массива дает адрес 1-го элемента массива, поэтому нет необходимости использовать '&'.

А для логической части вы должны продолжитьцикл после увеличения значения, чтобы избежать лишней путаницы и сравнений.

  if (count == 0)
{
    strcpy(smallest_word, word);
    strcpy(largest_word, word);
}

И нет необходимости в переменных самого длинного и наименьшего, поскольку вместо них обоих вы можете использовать ноль.рабочий код, который я отредактировал для вас:

#include <stdio.h>
#include <string.h>
#include <conio.h>

int main()
{
int finish = 0, longest=0, smallest=0, count =0;
char word[20], smallest_word[20], largest_word[20];
while (0 == finish)
{
    printf("enter word:\t");
    scanf("%s", word);
    if (count == 0)
    {
        strcpy(smallest_word, word);
        strcpy(largest_word, word);
        count++;
        continue;   //To ensure in first time loop ends here 
    }


    if (strcmp(word, smallest_word)<0)
        strcpy(smallest_word, word);
    else if (strcmp(word, largest_word) > 0)
        strcpy(largest_word, word);



    if (strlen(word) == 4)
    {
        finish++;
    }
    count++;
}
printf("smallest word: %s\n", smallest_word);
printf("largest word: %s\n", largest_word);

getch();
return 0;
}

Screenshot of output ::

Happy Coding:)

0 голосов
/ 19 июня 2019

Заголовочный файл 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);
0 голосов
/ 19 июня 2019

Размер строки можно увидеть с помощью strlen() из библиотеки string.h.

0 голосов
/ 19 июня 2019

относительно:

if (strcmp(word, smallest_word)<smallest)

и

if (strcmp (word, large_word)> longest)

strcmp() возвращает 0 или> 0 или <0.Он не возвращает указатель на что-либо.возвращаемое значение <0 указывает, что первый параметр находится в алфавитном порядке перед вторым параметром.Возвращаемое значение 0 указывает, что два параметра равны.Возвращаемое значение> 0 указывает, что первый параметр идет в алфавитном порядке после второго параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...