首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何显示国家资本,即使输入是不区分大小写的c+

如何显示国家资本,即使输入是不区分大小写的c+
EN

Stack Overflow用户
提问于 2022-05-02 13:30:41
回答 2查看 308关注 0票数 -1

我已经研究这段代码很长一段时间了,我找不到如何使这个大小写变得不敏感

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int findCountry(string arr[], int len, string seek)
{
    for (int i = 0; i < len; ++i)
    {
        if (arr[i] == seek) return i;
    }
    return -1;
}

int main(){
    string countries[5]={"Brunei", "Cambodia", "East Timor", "Indonesia", "Laos"};
    string capitals[5]={"Bandar Seri Begawan", "Phnom Penh", "Dili", "Jakarta", "Vientiane"};
        
    string country;
    
    cout << "Country: ";
    cin >> country;
    
    int index = findCountry(countries,5,country);
     if (index >= 0)
        cout << "Capital: " << capitals[index];
    else
        cout << country << " is not a South East Asian Country";
    
    return 0;
}

输出

代码语言:javascript
复制
Country: bRunEi
bRunEi is not a South East Asian Country

预期产出

代码语言:javascript
复制
Country: bRunEi
Capital: Bandar Seri Begawan

我被指示使用cstring头,但这是我唯一能猜到的事情,任何帮助都会感谢ps:对不起,英语不好。

EN

回答 2

Stack Overflow用户

发布于 2022-05-02 13:41:09

有几点改进可以简化您的代码。

首先,如果您使用标准集装箱为您的国家。

代码语言:javascript
复制
std::vector<std::string> countries = {"Brunei", "Cambodia", "East Timor", "Indonesia", "Laos"};

对于不区分大小写的输入,可以使用https://en.cppreference.com/w/cpp/string/byte/tolower或其同级触摸器进行转换。

std:收费器在<cctype>头中,但我认为这是<cstring>的一部分。

引用包含一个涵盖大小写的用法示例。

代码语言:javascript
复制
std::string str_tolower(std::string s) {
    std::transform(s.begin(), s.end(), s.begin(), 
                [](unsigned char c){ return std::tolower(c); }
                  );
    return s;
}

转换在标题中,您应该查看其中的许多简单算法,这些算法允许您以比在findCountry中使用常规的for -循环更简单的方式来描述代码。例如,查看algoritm::find。

表达式unsigned char c{ .}是一个lambda表达式,与算法结合在一起非常有用。https://en.cppreference.com/w/cpp/language/lambda

票数 1
EN

Stack Overflow用户

发布于 2022-05-02 13:43:44

关于大小写不敏感比较的

您可以使用下面的函数IsEqualStringsCaseInsensitive来比较忽略大小写的两个字符串。您可以调用它,而不是使用(arr[i] == seek)来比较字符串。

代码语言:javascript
复制
#include <string>
#include <cctype>

bool IsEqualStringsCaseInsensitive(std::string const & s1, std::string const & s2)
{
    size_t len1 = s1.length();
    size_t len2 = s2.length();
    if (len1 != len2) {
        return false;
    }
    for (size_t i = 0; i < len1; ++i) {
        if (isascii(s1[i]) && isascii(s2[i])) {
            // Both are ASCII - compare lower case version:
            if (std::tolower(s1[i]) != std::tolower(s2[i])) {
                return false;
            }
        }
        else {
            // Compare as-is:
            if (s1[i] != s2[i]) {
                return false;
            }
        }
    }
    return true;
}

关于您的代码的一些附加说明:

一般来说,最好使用(string arr[]).

  • You可以通过const&传递seek以避免复制。

UPDATE:基于@EvilTeach下面的注释( std::tolower只对ASCII字符有效),我修改了上面的代码。现在,它只在两个字符都是std::tolower的情况下才调用ASCII。否则将比较为-is(区分大小写没有任何意义,至少对其中一个没有意义,这意味着对于字符串相等,它们必须是相同的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72087458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档