我遇到问题,如果y_lim
由与secret
相同的字母组成,则此函数应返回1。
只要letters_guessed
至少有letters_guessed
中的1个相同字母,它就可以正常工作。如果有相同的字母2次或更多,它不起作用。我知道为什么,但我无法解决它,因为我不能删除相同的字母。
我无法从letters_guessed数组中删除相同的字母,因为它是常量,我无法将其更改为非常数。
再次......
如果:
secret
抱歉我的英文不好和长篇解释。 这是我的计划:
secret = "cat"
letters_guessed = "txaoc"
return 1
**Right**
If:
secret = "dog"
letters_guessed = "gefxd"
return 0
**Right**
If:
secret = "car"
letters_guessed = "ccr"
return 1
**Wrong, How can I solve this?**
答案 0 :(得分:0)
你可以:
答案 1 :(得分:0)
您可以通过维护所有26个字母的数组来保持内存中的迭代。
假设: - 所有字母都应为小写字母。秘密不应该重复写信。
逻辑: - 如果我们考虑过这封信,请将数组输入设为1。 97是' a'
的ascii值//声明头文件
#include "string.h"
int is_word_guessed(const char secret[], const char letters_guessed[])
{
int same = 0;
int alphabets[26];
// make all enteries 0
for (int k = 0; k <= 25; k++)
{
alphabets[k] = 0;
}
for (int i = 0; i < strlen(letters_guessed); i++)
{
for (int j = 0; j < strlen(secret); j++)
{
if (letters_guessed[i] == secret[j] && (alphabets[(char)letters_guessed[i] - 97] == 0))
{
same++;
alphabets[(char)letters_guessed[i] - 97] = 1;
}
}
}
if (same == strlen(secret))
return 1;
else
return 0;
}
答案 2 :(得分:0)
在不修改字符串的情况下执行此操作的一种方法是计算字符串中字母的出现次数。当猜测出现的字母多于秘密时,它就是未命中的。在秘密的猜测中出现字母的情况只是一种特殊情况,因为那时秘密中出现的次数为零。
在实践中,您不要保留两个单独的计数:首先将猜测字母添加到计数中,然后删除秘密的字母。一旦一个计数降到零以下,那就错过了。
您可以利用只有256个不同的字符并将数字保存在数组中的事实。数组的索引是字母的ASCII码。注意不要在负索引处访问数组。 C&#39; char
不保证是无符号的,因此您可以使用无符号临时变量或选择不考虑负值。
这是一个实现:
int contains(const char *guess, const char *secret)
{
int count[256] = {0}; // start with all-zero array
while (*guess) {
unsigned char c = *guess++;
count[c]++;
}
while (*secret) {
unsigned char c = *secret++;
if (count[c] == 0) return 0;
count[c]--;
}
return 1;
}
答案 3 :(得分:0)
这很容易。
在Haskell中它将是:
all (`elem` letters_guessed) secret
换言之:秘密中的所有字符必须是letters_guessed。
在C中(未经测试):
// Iterate though string 'secret' until there is a char not
// part of 'letters_guessed'. If there is none, return 1
unsigned check(char *secret, char *letters_guessed) {
unsigned length_secret = length(secret);
unsigned length_guessed = length(letters_guessed);
for (int i = 0; i < length_secret; i++) {
if (!elem(secret[i], letters_guessed) {
return 0;
}
}
return 1;
}
// Check if char 'current' is part of 'string'
unsigned elem(char current, char *string) {
unsigned length = length(string);
unsigned found = 0;
for (int i = 0; i < length; i++) {
if (current == string[i]) {
return 1;
}
}
return 0;
}