[英]C++ Function is printing unwanted numbers after endl (memory variable?)
[英]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()
是一個編譯時常量,與輸入的長度無關。
這是一個問題,因為您未初始化的數組中包含與您的upletters
或lowletters
數組匹配的內容。 由於您檢查了整個數組,因此您的程序也會打印出來。
解決方案是僅檢查已估算的數組部分。 你可以用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.