簡體   English   中英

在 C++ 中顯示不需要的數字

[英]Displaying unwanted numbers in C++

好的,所以我一直在使用 C++ 進行學校項目。 我必須輸入我的名字,當我輸入時,我輸入的字母將被轉換為整數。 相應地,字母從 1 到 26 對應於 a 到 z。 所以我想也許我可以使用這個:

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

    char lowletters[26] = {'a', 'b', 'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    char upletters[26]  = {'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    char fname[50], lname[50];
    int corrNums[26] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};

    cout << "Enter name: ";
    cin >> fname >> lname;

    for(int a = 0; a <= sizeof(fname)-1; a++){
        for(int b = 0; b < 26; b++){
            if(fname[a] == lowletters[b]){  
                cout<<corrNums[b]<<"\t";
            }
            if(fname[a] == upletters[b]){   
                cout<<corrNums[b]<<"\t";
            }
        }
    }

     for(int a = 0; a <= sizeof(lname)-1; a++){
        for(int b = 0; b < 26; b++){
            if(lname[a] == lowletters[b]){  
                cout<<corrNums[b]<<"\t";
            }
            if(lname[a] == upletters[b]){   
                cout<<corrNums[b]<<"\t";
            }
        }
    }

    return 0;   
}

所以我使用第一個循環從 fname 中獲取字符並將其與小寫和大寫字母進行比較以查找它是什么字母。 當它這樣做時,它將在 for 循環中顯示帶有 b 值的 corrNums(對應數字),以便匹配。

我運行它,乍一看我認為它顯示正確。 確實如此,但如果您注意到名字和姓氏的末尾,就會出現這些數字。 看一看:

在此處輸入圖像描述

問題是您使用sizeof(fname)sizeof(lname) (-1 在這里並不是特別重要)。 sizeof()是一個編譯時常量,與輸入的長度無關。

這是一個問題,因為您未初始化的數組中包含與您的upletterslowletters數組匹配的內容。 由於您檢查了整個數組,因此您的程序也會打印出來。

解決方案是僅檢查已估算的數組部分。 你可以用strlen()做到這一點:

for(int a = 0; a < strlen(fname); a++){
    //...
}
//...
for(int a = 0; a < strlen(lname); a++){
    // ...
}

當然,如果允許您使用std::string (許多 C++ 類不允許使用),那就容易多了:

std::string fname, lname;
//...
for(int a = 0; a < fname.size(); a++){
    //...
}
//...
for(int a = 0; a < lname.size(); a++){
    // ...
}

這通常是首選,因為您不能以這種方式超出緩沖區,但您可以做您想做的/您的教授希望您做的。

當您使用 char arrays 時,您必須使用strlen() 如果您使用std::string ,它將自動調整大小以適應您的輸入cin

你的解決方案可以通過做一些數學來簡化。 不需要那些 arrays 的字母和數字。 只需從 'a' 或 'A' 中減去 char 的值並加 1 即可得到數值。 您也可以在 function 內進行打印以避免重復代碼。

#include <iostream>
#include <string>

using namespace std;

void PrintName(std::string name)
{
    for (size_t a = 0; a < name.length(); a++)
    {
        char letter = name[a];
        if (letter >= 'A' && letter <= 'Z')
            cout << (letter - 'A' + 1) << "\t";
        else if (letter >= 'a' && letter <= 'z')
            cout << (letter - 'a' + 1) << "\t";
    }
}

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

    std::string fname;
    std::string lname;

    cout << "Enter name: ";
    cin >> fname >> lname;

    PrintName(fname);
    PrintName(lname);

    return 0;
}

如果您有 C++11 或更高版本,則可以進行基於范圍的循環,例如:

for (auto letter : lname)

我不想給你分配學校作業,但我很樂意指出一些有用的提示。 開始: arrays 當您的數組內容在數學上可重現時是不必要的:

  • 如果( fname[a]>='a' && fname[a]<='z' )lowletters 和 corrNums 中的匹配索引是 fname[a] - 'a'

  • 同樣,如果 ( fname[a]>='A' && fname[a]<='Z' ) upletters & corrNums 中的匹配索引是 fname[a] - 'A'

  • corrNums[i] = i+1,在任何情況下

  • 無論大小寫如何,您都會產生相同的結果,因此您可以使用 std::tolower 將支票減半

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM