试图随机生成一个字符串以获得执行条件
Trying to randomly generate a string in order to get a conditional to execute
看来C中的字符串是我的弱项,再次需要你们的帮助。我应该把它包括在我的第一个,所以我很抱歉。
所以我有这个功能,我可以正常工作,它用集合 {r, e, s, e, t} 和 returns 中的随机字符填充一个字符串:
char *inputString()
{
static char string[6];
const char *digits = "reset";
int i;
for (i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 4 + 0 ];
}
return string;
}
所以 string[5] 处的字符是 '\0',对吗? string[1] 到 string[4] 是其他字符(r, e, s, e, t)的随机组合。
现在,我有另一个调用这个函数的函数。它的这些目的是试图让 printf 语句执行:
other_fxn()
{
char *s;
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 's'
&& s[5] == '[=11=]')
{
printf('worked!\n');
break;
}
}
}
主要内容:
{
srand(time(NULL));
other_fxn();
}
它编译正常,但循环永远运行,if 语句永远不会执行。有人可以帮我解决为什么它不会执行。再次感谢。
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 't'
&& s[5] == '[=10=]')
{
printf('worked!\n');
break;
}
}
首先,在您的示例中,您正在寻找单词 "reses"。
而且您只是不更改循环内的字符串。因此,只有在初始生成后重置随机字符串时,您才会退出循环。我不知道你为什么需要这个,但上面的代码会跳出循环。也许不会那么快,但它会。
还有,这个是什么:
string[i] = digits[ rand() % 4 + 0 ];
为什么 + 0?
为什么 % 4
而不是 % 5
?
最好用这个:
char *inputString()
{
static char string[6];
const char *digits = "reset";
for (int i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 5];
}
return string;
}
并尝试使用调试器,它真的很有帮助。
您只有 运行 inputString
函数一次,因此您只会收到一个字符串。这可以通过将函数调用移动到 while (1)
循环来解决:
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 's'
&& s[5] == '[=10=]')
{
printf('worked!\n');
break;
}
}
此外,为了使您的代码稍微简洁一些,您可以使用 C 的 strcmp
函数来比较字符串,而不是检查每个单独的字符:
#include <string.h>
while (1)
{
s = inputString();
if (strcmp(s, "reset") == 0)
{
printf('worked!\n');
break;
}
}
除了@Pavel 所说的关于随机字符选择的内容之外,为了使其更具可重用性,您可以使用 sizeof
而不是硬编码 5
:
string[i] = digits[ rand() % (sizeof(string) - 1)]; // Also removed extraneous 0
我有两个变化要告诉你:
您可以确保 string[5] 为 0。(它应该已经是因为它是静态的)
char *inputString()
{
static char string[6];
const char *digits = "reset";
int i;
for (i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 4 + 0 ];
}
string[5] = '[=10=]'; // null terminate your string.
return string;
}
您可以通过将条件放在 while 条件检查中来避免执行 while(1)。然后在while循环后执行打印。
other_fxn()
{
char *s = inputString();
while (s[0] != 'r' || s[1] != 'e' || s[2] != 's' || s[3] != 'e' || s[4] != 's' || s[5] != '[=11=]')
{
s = inputString();
}
printf('worked!\n');
}
看来C中的字符串是我的弱项,再次需要你们的帮助。我应该把它包括在我的第一个,所以我很抱歉。
所以我有这个功能,我可以正常工作,它用集合 {r, e, s, e, t} 和 returns 中的随机字符填充一个字符串:
char *inputString()
{
static char string[6];
const char *digits = "reset";
int i;
for (i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 4 + 0 ];
}
return string;
}
所以 string[5] 处的字符是 '\0',对吗? string[1] 到 string[4] 是其他字符(r, e, s, e, t)的随机组合。
现在,我有另一个调用这个函数的函数。它的这些目的是试图让 printf 语句执行:
other_fxn()
{
char *s;
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 's'
&& s[5] == '[=11=]')
{
printf('worked!\n');
break;
}
}
}
主要内容:
{
srand(time(NULL));
other_fxn();
}
它编译正常,但循环永远运行,if 语句永远不会执行。有人可以帮我解决为什么它不会执行。再次感谢。
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 't'
&& s[5] == '[=10=]')
{
printf('worked!\n');
break;
}
}
首先,在您的示例中,您正在寻找单词 "reses"。 而且您只是不更改循环内的字符串。因此,只有在初始生成后重置随机字符串时,您才会退出循环。我不知道你为什么需要这个,但上面的代码会跳出循环。也许不会那么快,但它会。
还有,这个是什么:
string[i] = digits[ rand() % 4 + 0 ];
为什么 + 0?
为什么 % 4
而不是 % 5
?
最好用这个:
char *inputString()
{
static char string[6];
const char *digits = "reset";
for (int i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 5];
}
return string;
}
并尝试使用调试器,它真的很有帮助。
您只有 运行 inputString
函数一次,因此您只会收到一个字符串。这可以通过将函数调用移动到 while (1)
循环来解决:
while (1)
{
s = inputString();
if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 's'
&& s[5] == '[=10=]')
{
printf('worked!\n');
break;
}
}
此外,为了使您的代码稍微简洁一些,您可以使用 C 的 strcmp
函数来比较字符串,而不是检查每个单独的字符:
#include <string.h>
while (1)
{
s = inputString();
if (strcmp(s, "reset") == 0)
{
printf('worked!\n');
break;
}
}
除了@Pavel 所说的关于随机字符选择的内容之外,为了使其更具可重用性,您可以使用 sizeof
而不是硬编码 5
:
string[i] = digits[ rand() % (sizeof(string) - 1)]; // Also removed extraneous 0
我有两个变化要告诉你: 您可以确保 string[5] 为 0。(它应该已经是因为它是静态的)
char *inputString()
{
static char string[6];
const char *digits = "reset";
int i;
for (i = 0; i < 5; i++)
{
string[i] = digits[ rand() % 4 + 0 ];
}
string[5] = '[=10=]'; // null terminate your string.
return string;
}
您可以通过将条件放在 while 条件检查中来避免执行 while(1)。然后在while循环后执行打印。
other_fxn()
{
char *s = inputString();
while (s[0] != 'r' || s[1] != 'e' || s[2] != 's' || s[3] != 'e' || s[4] != 's' || s[5] != '[=11=]')
{
s = inputString();
}
printf('worked!\n');
}