tkd*_*_aj 1 c fsm segmentation-fault switch-statement fault
我是相对较新的C编程,我正在尝试制作分隔符检查器,但由于某种原因,每次我运行我的代码并且它获取我的输入来检查分隔符时,它有一个分段错误(核心转储)错误.
以下是主程序的代码:
int
main (void)
{
char* mystring;
printf ("Please enter a string\n");
gets(mystring);
if (fsm(mystring))
{
printf ("All matched");
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎永远不会进入子程序fsm,因为我在printf子程序的开头放了一个它从不出现.它会确实询问我的输入并将其打印出来,如果我将printf主程序放在子程序行之前.
这是我的原型:
boolean fsm(char[]);
Run Code Online (Sandbox Code Playgroud)
如果有任何帮助,这是子程序的开头:
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;
Run Code Online (Sandbox Code Playgroud)
你试图读到一个未初始化的char*.只是声明char *mystring没有给你一个字符串可以使用:你需要为字符串分配空间.
或者:
char *mystring = malloc(MAX_STRING_LENGTH);
Run Code Online (Sandbox Code Playgroud)
要么:
char mystring[MAX_STRING_LENGTH];
Run Code Online (Sandbox Code Playgroud)
一旦有了缓冲区,请使用fgets而不是gets.fgets允许您指定的上界上的字符数读取,因此fgets伴随着像MAX_STRING_LEN你就可以只接受尽可能多的数据您的缓冲区将举行.
实际上,由于C不初始化自动(本地)变量,mystring因此具有未定义的值.它可以指向任何随机的内存部分.当您尝试gets使用此内存位置时,您尝试写入不属于您的内存.
最后,这个单一的条件=:else if (mystring = '\0')是一个赋值,而不是一个相等的测试.