1

我对 C 编程相对较新,我正在尝试制作一个分隔符检查器,但由于某种原因,每次我运行我的代码并获取我的输入来检查分隔符时,它都会出现分段错误(核心转储)错误。

下面是主程序的代码:

int
main (void)
{
  char* mystring;
  printf ("Please enter a string\n");
  gets(mystring);
  if (fsm(mystring))
    {
      printf ("All matched");
    }
}

似乎它从未进入子程序fsm,因为我在printf子程序的开头输入了一个权利,它从未出现过。printf它确实会询问我的输入,如果我把它放在子程序行之前的主程序中,它会打印出来。

这是我的原型:

boolean fsm(char[]);

如果有任何帮助,这里是子程序的开头:

boolean fsm (char mystring[])
{
  printf("here\n");
  int counter = -1;
  int state = 0;
  c_stack top;
  c_init_stack (&top);
  while (1)
    {
      switch (state)
    {
    case 0:
      counter = counter + 1;
      if (is_open (*mystring))
        state = 1;
      else if (is_close (*mystring))
        state = 2;
      else if (mystring = '\0')
        state = 3;
      else
        state = 4;
      break;
4

1 回答 1

6

您正在尝试读入未初始化的char*. 仅仅声明char *mystring不会给你一个可以使用的字符串:你需要为字符串分配空间。

任何一个:

char *mystring = malloc(MAX_STRING_LENGTH);

或者:

char mystring[MAX_STRING_LENGTH];

一旦你有一个缓冲区,使用fgets而不是gets. fgets允许您指定读取字符数的上限,因此fgetsMAX_STRING_LEN将只能接受与缓冲区容纳的数据一样多的数据。

实际上,由于 C 不初始化自动(局部)变量,mystring因此具有未定义的值。它可以指向内存的任何随机部分。当您尝试gets使用此内存位置时,您正在尝试写入不属于您的内存。

最后,这个带有单个=:的条件else if (mystring = '\0')是一个赋值,而不是一个相等测试。

于 2012-09-07T00:24:03.263 回答