繁体   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