所以,我试图找出最好/最简单的方法来做到这一点。 对于我的算法类,我们应该从一个文件中读取一个字符串(最多包含40个字符)并使用字符串的第一个字符(data [1] ...我们在1处启动数组并希望使用数据[ 0]作为后来的其他东西)作为旋转的旋转次数(最多26个)来旋转后面的字母(基本上是凯撒密码)。

我们尝试做的一个例子是从一个文件中读入:2ABCD和输出CDEF。 我肯定做过尝试,但我不知道如何比较数组char []中的第一个字母,看看它是多少26个数字。 这就是我实现它的方式(不是整个代码,只是我遇到问题的部分):

int rotation = 0;
char data[41];

for(int i = 0; i < 41; i++)
{
    data[i] = 0;
}

int j = 0;
while(!infile.eof())
{
    infile >> data[j+1];
    j++;
}

for(int i = 1; i < 27; i++)
{
    if( i == data[1])
    {
        rotation = i;
        cout << rotation;
    }
}

我的输出始终为0表示旋转。 我确定问题在于我试图将char与数字进行比较并且可能必须转换为ascii? 但我只是想问一下,看看是否有更好的方法,并在正确的方向上得到一些指示,因为我对C ++语法很新。

谢谢,一如既往。

#1楼 票数:2

而不是格式化输入,使用未格式化的输入。 采用

data[j+1] = infile.get();

代替

infile >> data[j+1];

此外, idata[1]的比较需要不同。

for(int i = 1; i < 27; i++)
{
   if( i == data[1]-'0')
            //      ^^^ need this to get the number 2 from the character '2'.
   {
      rotation = i;
      std::cout << "Rotation: " << rotation << std::endl;
   }
}

#2楼 票数:1

您可以使用modulo数学来完成此操作,因为字符可以被视为数字。
我们假设只有大写字母(这使概念更容易理解)。

鉴于:

static const char letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const std::string original_text = "MY DOG EATS HOMEWORK";
std::string       encrypted_text;  

循环:

for (unsigned int i = 0; i < original_text.size(); ++i)
{

让我们将字符串中的字符转换为数字:

  char c = original_text[i];
  unsigned int cypher_index = c - 'A';

cypher_index现在包含字母的字母偏移量,例如“A”的索引为0。
接下来,我们通过添加偏移并使用运算来“循环”来旋转cypher_index

  cypher_index += (rotation_character - 'A'); // Add in the offset.
  cypher_index = cypher_index % sizeof(letters); // Wrap around.

最后,通过查找letters数组并附加到加密字符串来创建新的移位字母:

    encrypted_text += letters[cypher_index];
  } // End of for loop.

使用%运算符的运算非常适用于需要“环绕”索引的情况。

通过一些算术和数组,可以扩展该过程以处理所有字母和一些符号。

#3楼 票数:0

首先,你必须在比较它们之前将数据字符转换为int,只需将(int)放在char数组的元素之前,你就可以了。

其次,请记住ASCII表不以字母开头。 有一些有趣的符号直到60-so元素。 因此,当你使我等于数据[1]时,你实际上给它一个高于27的数字,所以循环停止。

#4楼 票数:0

大写字母的ASCII整数值范围为65到90.在C及其后代中,您可以在for循环中使用“A”到“Z”:

更改

for(int i = 1; i < 27; i++)

for(int i = 'A'; i <= 'Z'; i++)

你将比较大写值。 该声明

cout << rotation;

将打印从infile读取的ASCII值。

#5楼 票数:0

您可以使用多少标准库? 这样的事情可能会更好:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    int rotation = 0;
    std::string data;

    std::stringstream ss( "2ABCD" );
    ss >> rotation;
    ss >> data;

    for ( int i = 0; i < data.length(); i++ ) {
        data[i] += rotation;
    }

    // C++11
    // for ( auto& c : data ) {
    //     c += rotation;
    // }

    std::cout << data;
}

现场演示

我在这个例子中使用了字符串流而不是文件流,所以只需用你的infile替换ss 另请注意,我没有处理环绕式案例(即,Z + = 1不会给你A;你需要在这里做一些额外的处理),因为我想把它留给你: )

你的轮换总是0的原因是因为i永远不是== data[1] ASCII字符数字与其整数表示形式不具有相同的基础数字值。 例如,如果data[1]为'5',则它的整数值实际为49. 提示 :处理环绕情况时,您需要知道这些值。 快速谷歌“ANSI字符集”,你会看到所有不同的价值观。

您对旋转的确定也存在缺陷,因为您只是在检查data[1] 如果您有一个两位数的数字,如10,会发生什么?

  ask by GiH translate from so

未解决问题?本站智能推荐:

6回复

是围绕一个正确的方式进行浮动-双重比较

以这个问题为基础,众所周知,我们不应该将equals比较运算应用于十进制变量,因为数字错误(它没有绑定到编程语言): 它的代码是不对的。 我的问题是: 将这两个数字四舍五入然后进行比较是正确的吗? 它效率更高? 例如: 它是正确的? 编辑 我正在考虑round是
3回复

C++set_intersection比较函数

使用<algorithm>的函数时,通常会有一个额外的参数来自定义比较。 但是我对有关参数的描述( set_intersection的文档 )不太了解。 二进制函数,它接受输入迭代器指向的两个类型的参数,并返回可转换为bool的值。 返回的值指示是否按照它定义的特定严格弱顺
4回复

比较两个字符串作为数值

我应该如何比较 C++ 中表示数字的两个字符串? 我想转换为long long类型的数量,但问题是string表示的数值可能超过long long MAX限制。 保证字符串代表一个数值。 Java 中有一个类似的问题compare two numeric String values 。 但这利用了
3回复

字符串与最相似的字符串比较

有没有人知道如果存在给定一个字符串A和一个字符串B数组的算法,将A字符串与B中的所有字符串进行比较,给出输出中最相似的字符串。 对于“最相似的”,我的意思是,例如, 如果A字符串是:“hello world你好吗” 然后 “asdf asdewr你好世界怎么asfrqr你”
2回复

C++整数序列的有效比较(按相对顺序)

如果您能帮助我在 C++ 中有效实现比较算法,我将不胜感激。 我的程序得到一个由整数序列行组成的输入,我需要找出哪些序列是重复的。 但是有些序列可能会被移到一边,它应该仍然是相等的。 我的意思是例如序列 {0, 1, 22, 5, 9} 和 {22, 5, 9, 0, 1} 应该相等。 这些序列或重
2回复

比较没有一行共同的两个大文件

我有两个大(10M 行)文件,都是数据文件。 每行包含许多字段,最后 3 个字段给出 x、y、z 位置为了检查我的随机生成器,我想确保在一个文件中没有一行的位置与文件中的任何行相同第二个文件。 我唯一想到的是 当然,这非常耗时(我尝试了 bash 脚本和 C++ 程序,我不确定哪个会更快)。 有谁知
2回复

具有一个不匹配的字符串的算法

有人可能建议一个更好的方法来进行两个字符串之间的字符串比较,最多只有一个不匹配。 例: 答:abcdefghabX B:abc 输出:1 9 上面的输出是“A”中abc的子串匹配的位置 我尝试了两个for循环的基本方法,但似乎需要N * N时间。 这是大投入的一个
5回复

如何将char与int进行比较?

好的,基本上,我有一个包含9x9网格的文件(数独难题)。 现在,此数独难题仅部分完成,空白处将替换为“ _”(下划线)。 所以这是文件的外观。 这是我的代码: 我遇到的问题是在这条线上: 我在ASCII表中查找了下划线的十进制值,这就是我发现的结果。 但是,无论何时执行循环中的