मैं एक फ़ंक्शन में नामों की एक सरणी भेज रहा हूं जो प्रत्येक नाम की लंबाई की गणना करना चाहिए और वर्णों की संख्या के रूप में सबसे बड़ा वापस भेजना चाहिए। सबसे लंबे और नामों के बीच मेरी तुलना [i] लंबाई () कभी भी सच नहीं होती है। मैं सबसे लंबे समय तक -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 वापस प्राप्त करना चाहिए/चाहते हैं।

6
William S 29 मार्च 2020, 10:33

2 जवाब

सबसे बढ़िया उत्तर

समस्या डेटा प्रकार के साथ है 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;
}
8
albusSimba 29 मार्च 2020, 11:09

हस्ताक्षरित मान longest की अहस्ताक्षरित मान names[i].length() के साथ तुलना करते समय, संकलक हस्ताक्षरित मान को unsigned मान में परिवर्तित करता है, जो int longest बनाता है जो प्रारंभ में -1 है, एक बहुत बड़ी अहस्ताक्षरित संख्या 4294967295

तो, अनिवार्य रूप से, यह हमेशा असत्य का मूल्यांकन करता है:

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

फिक्स:

आप string.length() से लौटाए गए अहस्ताक्षरित int को int . में टाइप कर सकते हैं

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

या सबसे लंबे को शुरू से एक अहस्ताक्षरित इंट बनाएं

6
Abhishek Jaisingh 29 मार्च 2020, 11:51