【问题标题】:How to get an easier way of generating the alphabet in C++?如何获得在 C++ 中生成字母表的更简单方法?
【发布时间】:2020-09-12 07:46:28
【问题描述】:

我正在尝试制作一个项目,实验和学习 C++,我没有完成它,但它所做的是你输入一个 3 或 4(变量 noc)的单词,程序运行所有可能的( noc)字母词或废话,直到找到你的,所以有两个因素:单词或废话的长度以及它可以输入的字符,在我的情况下,我只想要字母表 所以这是我的代码:

#include <iostream>
#include <unistd.h>
using namespace std;

const int noc = 3;

int main() {

    string used[noc];
    string inp;
    cin >> inp;
    char albet[] = {'a','b','c'};
    cout << "Starting..." << endl;
    usleep(1);
    string aiput = "";
    while(aiput != inp){
        for(int i = 0; i <= noc; i++){
            aiput = aiput +
        }
    }

    return 0;
}

目前我需要名为“albet”的数组中的字母表(我想出了简短的词来表示它们的意思很容易忘记) 所以请你给我一种在 C++ 中快速生成字母表的方法,而不是一个一个地输入所有字母表

【问题讨论】:

  • 'a'-'z' 在 ASCII 中是连续的,但在 C++ 中没有保证(在 EBCDIC 中,该范围不连续)。我不认为你可以用可移植的方式用算术生成它。
  • @Jarod42 由于 OP 仍在学习,因此仅依赖 ASCII 应该没有问题。
  • 是的,提问者可能在整个编程生涯中都没有看到不连续或乱序的字符集,但很高兴知道它们的存在。
  • 为什么不直接输入 26 个字母作为字符串并使用该字符串呢?英语不是具有数千个字符的语言。有时最简单的解决方案并不那么明显。即使您必须一个接一个地输入它们,那又如何?即 26 个字符、52 个字符、引号和逗号。这几乎不是什么工作,IMO。

标签: c++ arrays project shortcut alphabet


【解决方案1】:

你可以使用std::iota,这是一个非常适合这个用例的算法:

char albet[26] {};
std::iota(std::begin(albet), std::end(albet), 'a');

这是demo

请注意,这不是保证在 c++ 中工作的,除非你有 ASCII 编码,但如果你可以依赖它,你会没事的。

【讨论】:

  • 我认为如果标准库有一个编译时常量来检查字符串文字编码是否为 ASCII,或者至少如果字母表是连续的,那将是整洁的。有already one for checking that floating point types us iec559,感觉它的用例比检查字母是否连续更窄。
  • @FrançoisAndrieux 那太好了。我想知道它的适用性是什么,即是否有许多使用非 ascii 编码的架构?如果不是,我希望标准最终会强制执行此操作,就像他们对非 2 的互补架构所做的那样。
【解决方案2】:

每个字母都有一个 ASCII 表示。更多关于 here.

它们被处理为数字,被转换为字符。例如,字母 a 将由十进制数字 97 表示。

int aInAscii = 97;
printf("%c", (char)aInAscii);

如您所料,上面的代码将打印字母a。为什么?因为我们刚刚将数字 97 转换为它的 ASCII 对应字符。

因此,通过这种方式,我们可以仅使用数字生成字母表。一个简短的例子是here(我更喜欢在之前转换它,以便起点和终点更清楚。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<char> alphabet;
    int aLetterCode = (int)'a'; // ASCII code for letter a (97)
    int zLetterCode = (int)'z'; // ASCII code for letter z (122)
    for (int charAsciiCode = aLetterCode; charAsciiCode <= zLetterCode; charAsciiCode++) {
        alphabet.push_back((char)charAsciiCode);
    }
    for (char c : alphabet) {
        cout << c << " ";
    }
    return 0;
}

【讨论】:

  • 第一个示例最好使用cout 而不是printf
  • @SealsRock12 非常同意这一点,但我想使用格式说明符来明确它是一个字符(“%c”)。
  • 我明白了。没关系。
【解决方案3】:

因为所有字符都可以用 ASCII 码表示('a' 从 97 开始,所有 ASCII 码都是 int),你可以简单地做一个循环来做到这一点。例如:

char albet[26];

for (int ch = 'a'; ch <= 'z'; ch++) {
    //do ch-'a' because we start at index 0
    albet[ch-'a'] = ch;
}

你就完成了!

【讨论】:

    【解决方案4】:

    您可以使用static_cast&lt;char&gt; 轻松地将数字转换为ASCII。知道了这一点,您可以将它放在一个循环中,其中“i”从 65 开始,并在 26 次之后结束。为了跟踪你应该把字母放在哪里,你可以参考 i-65,它从零开始,而不是 65。

    char alphabet[26]; // 26 as in the number of letters in the alphabet
    for(int i = 65; i < 91; i++)
    {
        alphabet[i-65] = static_cast<char>(i);
    }
    

    这将立即为您提供完整的字母表。

    编辑:如果您希望这样做,您可以查看“asciitable.com”以查看小写字母的代码。

    【讨论】:

    • 您可以使用 'a''z' 等字符文字来代替整数常量,以获得更好的可读性,严格来说,还有可移植性。 alphabet 是语言不允许的零大小数组。 ASCII 编码无处不在,但不是必需的。
    【解决方案5】:

    当您需要一个字符数组时,您不必一一使用单个字符文字,如

    char albet[] = {'a','b','c','d','e','f',... uff this is tedious ...};
    

    您可以使用字符串文字代替:

    const std::string albet{"abcdefghijklmnopqrstuvwxyz"};
    

    我花了大约 10 秒的时间输入并与其他答案相比,这不依赖于 ASCII 编码(不能保证)。

    【讨论】:

    • 我对此表示赞同。我在主要部分中的 cmets 描述了您所做的事情。令人惊讶的是,有时最简单的解决方案却被忽视了。
    【解决方案6】:

    您也可以创建一个返回字符的函数,而不生成数组,如下所示:

    char get_alphabet_letter(unsigned int index, bool is_upper = false)
    {
        char letter = 97 + index;
        if(is_upper) return letter - 32;
        return letter;  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多