C ++ Почему мое сравнение между int и str.length () не работает? - PullRequest
6 голосов
/ 29 марта 2020

Я отправляю массив имен в функцию, которая должна вычислять длину каждого имени и возвращать наибольшее из них в виде количества символов. Мое сравнение между longest и names [i] .length () никогда не соответствует действительности. Я инициализирую самое длинное в -1, поэтому имя должно заменить -1 длиной символов в этом имени, однако в конце функции оно возвращает самое длинное с моим начальным значением -1

#include <iostream>
#include <string>
using namespace std;

int findLongestName(string names[], int numNames);

int main() {
   string names[25] {"Bob Hope", "Steve Nice", "Mary Jane", "James Higgenbothem", "Ace Blue"};
   int numNames = 5;
   int longName;

   longName = findLongestName(names, numNames);
   cout << "Longest name is " << longName << " characters.\n";

   system("PAUSE");
   return 0;
}

int findLongestName(string names[], int numNames) {
    int longest = -1;

    for (int i = 0; i < numNames; i++) {
        if (names[i].length() > longest) {
            longest = names[i].length();
        }
    }

    return longest;
}

Может кто-то посмотрите и объясните, что я делаю не так? Я должен / хочу получить 18 обратно из функции для имени Джеймс Хиггенботем.

Ответы [ 2 ]

9 голосов
/ 29 марта 2020

Проблема с типом данных names[i].length() возвращает unsigned int. Сравнение -1 с names[i].length() всегда даст вам false.

int findLongestName(string names[], int numNames) {
    unsigned int longest = 0;

    for (int i = 0; i < numNames; i++) {
        if (names[i].length() > longest) {
            longest = names[i].length();
        }
    }

    return longest;
}
6 голосов
/ 29 марта 2020

при сравнении значения со знаком longest со значением без знака names[i].length() компилятор преобразует значение со знаком в значение unsigned, что составляет int longest, которое изначально -1, очень большое число без знака 4294967295

Таким образом, по сути, это всегда имеет значение false:

if (names[i].length() > longest)

Исправления:

Вы можете типизировать целое число без знака, возвращаемое из string.length () в int

if ((int)names[i].length() > longest) {

или сделать самым длинным беззнаковым целым с самого начала

...