字谜检测方法c++。将字符串转换为 ascii 值的问题

Posted

技术标签:

【中文标题】字谜检测方法c++。将字符串转换为 ascii 值的问题【英文标题】:Anagram detection method c++. Problems converting string to ascii value 【发布时间】:2017-04-27 13:53:28 【问题描述】:

对于任何能够帮助我解决这个问题的人。我正在创建一种方法来比较两个字符串并检测它们是否是字谜。字谜是具有相同字母的两个字符串,尽管它们的顺序可能不同。例如“listen”和“iltsen”是字谜。

我决定将字符串分解为 char 数组。我知道它工作正常,因为我在每个数组元素上使用 cout 对其进行了测试。接下来是哪里出错了。我尝试使用每个字符的 ASCII 值并将其添加到每个数组的变量中。这意味着如果值匹配,则它们必须是字谜。

但是,无论出于何种未知原因,它都无法正常工作。我发现它为一个数组读取索引 0 两次,而不是另一个数组。我很困惑,无法解释。我完全不知道这是怎么回事。我尝试了多种不同的解决方案,但没有找到问题所在。如果有人知道这里发生了什么,我将不胜感激。

-谢谢!

#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
#include <cctype>
#include <vector>
using namespace std;

bool isAnagram(string s1,string s2)


static char firstString[] =  'c' ;
static char secondString[] =  'c' ;
int size = s1.length();
static int count1 = 0;
static int count2 = 0; 
cout << s1 << endl;
cout << s2 << endl;
if (s1.length() == s2.length())

    for (int i = 0; i < size; i++)
    
        firstString[i] = s1.at(i);
        cout << i;
    
    for (int i = 0; i < size; i++)
    
        secondString[i] = s2.at(i);
        cout << i;
    
    cout << endl;

    for (int i = 0; i < size; i++)
    
        count1 = count1 + (int)firstString[i];
        cout << "first" << i << ": " << firstString[i] << " = " <<         (int)firstString[i] << endl;
        count2 = count2 + (int)secondString[i];
        cout << "second" << i << ": " << secondString[i] << " = " << (int)secondString[i] << endl;
    
    cout << count1 << " and " << count2 << endl;
    if (count1 == count2)
        return true;

else
    return false;

count1 = 0;
count2 = 0;


int _tmain(int argc, _TCHAR* argv[])

static char end;
do

    string s1;
    string s2;

    cout << "Please enter the first string: ";
    cin >> s1;
    cout << endl << "Please enter the second string: ";
    cin >> s2;

    bool result = isAnagram(s1, s2);
    static string resultString;

    if (result == true)
        resultString = "True";
    else
        resultString = "False";

    cout << endl << "Anagram test result: " << resultString << endl;
    cout << endl << "enter E for end or any other key to run again: ";
    cin >> end;
    cout << "----------------------------------------" << endl;
 while (end != 'e' && end != 'E');

return 0;
 

【问题讨论】:

为什么数组和计数是静态的?你应该使用 std::vectors 而不是数组 firstString[i] = s1.at(i); 你不能这样做:缓冲区太小了。 已经存在于标准库中:std::is_permutation 我将它们设为静态,以便考虑到它们超出范围,可以在循环内修改它们的值。这是一个正确的假设吗?还有让,谢谢你的回复。有没有办法将缓冲区设置为更大的大小?保罗,也感谢您的回复。您提供的链接很有帮助。 你需要检查s1和s2的长度是否相同。之后将您的两个 char 数组分配给该大小。 【参考方案1】:

在你的情况下使用静态变量没有用,没有它们你就不需要isAnagram 的最后两行。 将两个字符串存储在 char 数组中也是没有用的,因为您可以直接在第三个循环中使用它们(而且您正在溢出大小为 1 的缓冲区)

for (int i = 0; i < size; i++)

    std::cout << count1 << " ";
    count1 = count1 + (int)s1.at(i);
    cout << "first" << i << ": " << s1.at(i) << " = " << (int)s1.at(i) << endl;
    count2 = count2 + (int)s2.at(i);
    cout << "second" << i << ": " << s2.at(i) << " = " << (int)s2.at(i) << endl;

此外,您不能通过比较它们的 ASCII 值之和来说 2 个字符串确实包含相同的字母,这就像说 3 + 4 与 2 + 5 相同,因为两者都给出 7。 您可以创建一个包含 52 个 ints 的数组,每个元素都是其自己字母的计数器,然后您可以使用一个循环遍历两个字符串,其中第一个字符串的每个字母递增其在数组中的元素,第二个字符串字母是递减的元素。

if (s1.length() != s2.length())
    return false;

std::vector<int> counts(52);

for (unsigned int i = 0; i < s1.length(); ++i)

    ++counts[s1[i] - (s1[i] < 91 ? 65 : 71)];
    --counts[s2[i] - (s2[i] < 91 ? 65 : 71)];

确保数组初始化为 0。 最后,您需要遍历数组,如果其中一个元素不是 0,则它不是字谜,否则返回 true。

for (unsigned int i = 0; i < 52; ++i)
    if (counts[i] != 0)
        return false;

return true;

【讨论】:

以上是关于字谜检测方法c++。将字符串转换为 ascii 值的问题的主要内容,如果未能解决你的问题,请参考以下文章

将十六进制转换为从文件 C++ 读取的 ASCII 的正确方法

非托管 C++ 加密字符串转换为 C# byte[]

PHP 将 ASCII 码转为字符串,字符串转换 ASCII 码

将 ASCII 值数组转换为一个字符串

将字符串转换为ASCII值

在 C++ 中将唯一字符串转换为唯一整数值