【问题标题】:Trying to randomly generate a string in order to get a conditional to execute尝试随机生成一个字符串以获得执行条件
【发布时间】:2015-07-18 00:23:10
【问题描述】:

C 中的字符串似乎是我的弱点,再次需要你们的帮助。我应该把它包含在我的第一个中,所以对此我深表歉意。

所以我有这个可以正常工作的函数,它用集合 {r, e, s, e, t} 中的随机字符填充一个字符串并返回它:

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] == '\0') 
    {
      printf('worked!\n');
      break;
    }
  }
}

主要:

{
   srand(time(NULL));
   other_fxn();
}

它编译得很好,但循环永远运行,if 语句永远不会执行。有人可以帮我弄清楚为什么它不会执行。再次感谢。

【问题讨论】:

  • 您不想将s = inputString(); 放入循环中吗?
  • 是的,很抱歉我第一次在这里打印错了。它在循环内。
  • 您从未真正分配 string[5] = '\0'。因此,您从 input_string 返回的 c 字符串可能不会以空值结尾。这也可能导致您的无限循环行为。
  • @TimothyMurphy stringstatic。所以它被初始化为0
  • 如果您修复损坏的 printf 语句并添加缺少的标题,代码 works as expected

标签: c random c-strings


【解决方案1】:
  while (1) 
  {    
  s = inputString();
    if (s[0] == 'r'&& s[1] == 'e' && s[2] == 's' && s[3] == 'e' && s[4] == 't'
        && s[5] == '\0') 
    {
      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;
}

并尝试使用调试器,它真的很有帮助。

【讨论】:

  • 抱歉函数应该在循环内,第一次发错了
  • 字符串 [5] 不是已经 '\0' 了吗?当我声明它时:字符串 [6] 我认为这意味着空字节位于字符串 [5] 处,字符索引为 0 -4
  • 如果我错了,请纠正我,但static 变量不是因为它们位于data 部分而总是初始化为零吗?如果是这样,string[5] = '\0'; 是多余的,因为它已经是 0
  • @Levi 还有这个 - stackoverflow.com/questions/1414215/… 说清楚 - 是的,你是对的,静态使它初始化。
【解决方案2】:

您只运行一次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] == '\0') 
    {
      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

【讨论】:

  • 抱歉函数应该在循环内,第一次发错了
【解决方案3】:

我有两个变化给你: 您可以确保 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] = '\0'; // 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] != '\0') 
   { 
    s = inputString();
   }
   printf('worked!\n');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2017-08-01
    • 2011-06-30
    • 2012-11-21
    • 2010-10-18
    相关资源
    最近更新 更多