字谜检测方法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 个 int
s 的数组,每个元素都是其自己字母的计数器,然后您可以使用一个循环遍历两个字符串,其中第一个字符串的每个字母递增其在数组中的元素,第二个字符串字母是递减的元素。
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 的正确方法