试图随机生成一个字符串以获得执行条件

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');
}