简单地说Soundex算法将一系列字符更改为代码。据说产生相同Soundex代码的字符听起来是一样的。
字母表中的每个字符都属于一个特定的组(至少在这个例子中,然后是代码,这是我将坚持的规则):
其他值得注意的规则包括:
例如,单词“Ray”将产生以下Soundex代码:R000(R是所提供单词的第一个字符,a是0组的一部分,所以它被忽略,y是0组的一部分所以它被忽略了,没有其他字符,因此代码中剩余的3个字符为0)。
我已经创建了一个传递给它的函数1)一个128字符数组,用于创建Soundex代码和2)一个空的5个字符数组,用于在完成时存储Soundex代码函数(并通过引用传回,因为大多数数组都在我的程序中使用)。
然而,我的问题是转换过程。我上面提供的逻辑并不完全适用于我的代码。我不知道为什么。
// CREATE A SOUNDEX CODE
// * Parameter list includes the string of characters that are to be converted to code and a variable to save the code respectively.
void SoundsAlike(const char input[], char scode[])
{
scode[0] = toupper(input[0]); // First character of the string is added to the code
int matchCount = 1;
int codeCount = 1;
while((matchCount < strlen(input)) && (codeCount < 4))
{
if(((input[matchCount] == 'b') || (input[matchCount] == 'p') || (input[matchCount] == 'v') || (input[matchCount] == 'f')) && (scode[codeCount-1] != 1))
{
scode[codeCount] = 1;
codeCount++;
}
else if(((input[matchCount] == 'c') || (input[matchCount] == 'g') || (input[matchCount] == 'j') || (input[matchCount] == 'k') || (input[matchCount] == 'q') || (input[matchCount] == 's') || (input[matchCount] == 'x') || (input[matchCount] == 'z')) && (scode[codeCount-1] != 2))
{
scode[codeCount] = 2;
codeCount++;
}
else if(((input[matchCount] == 'd') || (input[matchCount] == 't')) && (scode[codeCount-1] != 3))
{
scode[codeCount] = 3;
codeCount++;
}
else if((input[matchCount] == 'l') && (scode[codeCount-1] != 4))
{
scode[codeCount] = 4;
codeCount++;
}
else if(((input[matchCount] == 'm') || (input[matchCount] == 'n')) && (scode[codeCount-1] != 5))
{
scode[codeCount] = 5;
codeCount++;
}
else if((input[matchCount] == 'r') && (scode[codeCount-1] != 6))
{
scode[codeCount] = 6;
codeCount++;
}
matchCount++;
}
while(codeCount < 4)
{
scode[codeCount] = 0;
codeCount++;
}
scode[4] = '\0';
cout << scode << endl;
}
我不确定是不是因为我过度使用了strlen,但由于某种原因,当程序在第一个while循环中运行时,没有任何字符实际上被转换为代码(即没有if语句实际运行)。
那么我做错了什么?任何帮助将不胜感激。
答案 0 :(得分:3)
而不是
scode[codeCount] = 1;
你应该写
scode[codeCount] = '1';
当你形成一个char数组时,前者实际上是第一个ascii字符,而后者是字符'1'。
答案 1 :(得分:0)
C ++不支持您似乎尝试使用的动态数组。您需要调查std :: string类的用法。我的本质是你的循环变成这样的东西:
void Soundex( const string & input, string & output ) {
for ( int i = 0; i < input.length(); i++ ) {
char c = input[i]; // get character from input
if ( c === .... ) { // if some decision
output += 'X'; // add some character to output
}
else if ( ..... ) { // more tests
}
}
}
答案 2 :(得分:0)
您正在调用strlen()而没有在字符串中添加任何null char终止。所以strlen()的返回值可能就是任何东西。你可以通过在你开始之前用'\ 0'填充“scode”来解决这个问题,尽管最好有一个单独的计数器,只需在你完成后添加'\ 0'。 / p>
答案 3 :(得分:0)
这实际上是C实现而不是C ++。无论如何,你确定你的字符串是空终止的吗?否则strlen将无效。
这些建议将使您的代码更易于阅读和调试: