变量只拾取传递字符串的一个字母

时间:2014-01-29 15:02:47

标签: c

我一直在设计测试功能作为任务的一部分,我被困在一个部分。基本上,为了让循环退出,我需要状态为9,s字符串为“reset \ 0”。在测试中,我可以达到状态9,这意味着inputChar()可以正常工作。另一个测试表明inputString()正在生成一个有效的字符串,但是s没有正确获取该值。我认为它必须是一个指针问题,btu我经过一段时间的修补后无法弄清楚是什么。

int RandInt(int low, int high) {
  return low + rand() % (high - low + 1);
}

char inputChar()
{
    return RandInt(' ', '}');
}    

char *inputString()
    {
    int i;    
    char* iString[6];

    for (i = 0; i< 5; i++){
        iString[i] = RandInt('e', 't');
    }
    iString[5] = '\0';
    return iString;
}

void testme()
{
  int tcCount = 0;
  char *s;
  char c;
  int state = 0;
  while (1)
  {
    tcCount++;
    c = inputChar();
    s = inputString();
    printf("Iteration %d: c = %c, s = %s, state = %d\n", tcCount, c, s, state);

    if (c == '[' && state == 0) state = 1;
    if (c == '(' && state == 1) state = 2;
    if (c == '{' && state == 2) state = 3;
    if (c == ' '&& state == 3) state = 4;
    if (c == 'a' && state == 4) state = 5;
    if (c == 'x' && state == 5) state = 6;
    if (c == '}' && state == 6) state = 7;
    if (c == ')' && state == 7) state = 8;
    if (c == ']' && state == 8) state = 9;
    if (s[0] == 'r' && s[1] == 'e'
       && s[2] == 's' && s[3] == 'e'
       && s[4] == 't' && s[5] == '\0'
       && state == 9)
    {
      printf("error ");
      exit(200);
    }
  }
}

运行上面的输入将永远运行,因为s只是一个字符,而不是“reset \ 0”

2 个答案:

答案 0 :(得分:2)

函数inputString返回其自动变量的地址,一旦您尝试使用它,就会导致未定义的行为。您可以修改inputString函数以接收指针作为其参数,并通过它提供其输出。

例如:

void inputString(char *iString)
{
    int i;    

    for (i = 0; i< 5; i++){
        iString[i] = RandInt('e', 't');
    }

    iString[5] = '\0';
}

并使用以下逻辑调用该函数:

char iString[6];

inputString(iString);

答案 1 :(得分:0)

您可以在此处找到代码中的问题:

char *inputString()
    {
    int i;    
    char* iString[6];

    for (i = 0; i< 5; i++){
        iString[i] = RandInt('e', 't');
    }
    iString[5] = '\0';
    return iString;
}

您返回了指向本地数组变量iString的指针。重要的是,您要清楚地了解变量的“生命周期”iStringinputString()函数内 。{。} 当函数以最终return语句退出时,该变量将被销毁。 因此,您返回了一个指向不再有效的字符串的指针。

您有几种选择:

  1. 您可以请求函数的调用者提供目标字符串缓冲区作为函数参数,并在函数内填充该缓冲区。

  2. 您可以使用static局部变量(其生命周期扩展了函数范围),但我不太喜欢它。

  3. 您可以使用函数内部的malloc()分配内存,并返回指向已分配内存的指针。函数的调用者必须使用free()释放该内存。

  4. 另请注意,如果您想在C中使用字符串,则可以执行

    char iString[6]; /* C string with max. 5 chars + NUL terminator */
    

    char* iString[6]; /* array of pointers to char's/strings */