C Программа неправильно печатает строки - PullRequest
0 голосов
/ 24 марта 2020

Вот мой код на данный момент:

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

#define WORD_LEN 20

int main(int argc, char *argv[]) {

    int i;
    char smallest_word[WORD_LEN + 1],
         largest_word[WORD_LEN + 1],
         current_word[WORD_LEN + 1];

    current_word == argv[1];
    strcpy(smallest_word, (strcpy(largest_word, current_word)));

    for (i=2; i<argc; i++) {
        current_word == argv[i];

        if (strcmp(current_word, smallest_word) < 0) {
            strcpy(smallest_word, current_word);
        }
        else if (strcmp(current_word, largest_word) > 0) {
            strcpy(largest_word, current_word);
        }
    }

    printf("\nSmallest word: %s", smallest_word);
    printf("\nLargest word: %s", largest_word);

    return 0;
}

Цель этой программы - взять аргументы (слова) из командной строки и сравнить их, чтобы увидеть, какой из них наименьший по сравнению с самым большим (АКА). Алфавитный порядок). Я чувствую, что у меня не работает программа, и она должна работать, но когда я пытаюсь запустить код, вместо этого выводятся странные волнистые символы. Если бы мой ввод был следующим, то вывод был бы:

Вход:

./whatever.exe hello there general kenobi

Выход:

Smallest word: ▒
Largest word: ▒

В то время как правильный вход и выход должен быть как следует:

Входные данные:

./whatever.exe hello there general kenobi

Выходные данные:

Smallest word: general
Largest word: there

Я не уверен, является ли это проблемой типа или у меня что-то не так с моим программа целиком С нетерпением жду любых отзывов

1 Ответ

1 голос
/ 24 марта 2020

Неправильный способ присвоения строки

В приведенном ниже примере сравниваются 2 указателя, а затем отбрасывается результат. 2 места

current_word == argv[1];  // Not the needed code
current_word == argv[i];

Вместо этого требовалась копия строки .

strcpy(current_word, argv[1]);

Такой код опасен, поскольку длина строки argv[1] может соответствовать / превышать размер массива current_word. Лучший код будет проверять. Пример:

if (strlen(argv[1]) >= sizeof current_word)) {
  fprintf(stderr, "Too big <%s>\n", argv[1]);
  exit(EXIT_FAILURE);
}
strcpy(current_word, argv[1]);
...