я получаю ошибку сегментации, когда я использую strcat.please скажите мне, что происходит не так - PullRequest
0 голосов
/ 08 июня 2019
void rpn(char*text)
{static int j=0;
char st[10];
char str[80]="";
int i;
int n=strlen(text);
for(i=0;i<n;i++)
{printf("enter\n");
    if(text[i]=="(")
    {
       continue; 
    }
    else if(text[i]=='+'||text[i]=='*'||text[i]=='-'||text[i]=='/'||text[i]=='^')
    {
      st[j]=text[i];
      printf("%c\n",st[j]);
      j++;
    }
    else if(text[i]==')')
    {
       strcat(str,st[j]);
       printf("%c\n",str);
        j--;
    }
    else
    {   
        printf("yay\n");
       strcat(str,text[i]);
       //strcat(str,'\0');
       printf("%c\n",str);
    }
}
if(st[j]!="null")
{int k;
    for(k=j;k>=0;k--)
    {
        strcat(str,st[j]);
    }
}

}
int main()
{
printf("find ex\n");
char texts[]="((a+t)*((b+(a+c))^(c+d)))";
rpn(texts);
return 0;
}

Выходные данные: find ex
enter
yay
Ошибка сегментации, она печатает yay, но когда ей нужно скопировать букву "a" из текста [i] в ​​str, отображается ошибка сегментации.я не понимаю, почему я попробовал все, что выделено дополнительное пространство и т. д., кажется, ничего не работает.

1 Ответ

3 голосов
/ 08 июня 2019

В вашем коде есть несколько проблем

static int j = 0;

почему j является статическим, когда используется какиндекс в st , который не статический

if (text [i] == "(")

неверный, вы сравниваете символ со строкой, поведение не определено

strcat (str, st [j]);

недопустимо, второй аргумент являетсясимвол вместо строки

printf ("% c \ n", str);

недопустим, формат ожидает int (являющийся кодом символа для его печати), но аргумент является строкой

strcat (str, text [i]);

недопустим, второйаргумент является символом, а не строкой

, если (st [j]! = "null")

недопустимо, вы сравниваете символ и строку,поведение не определено

strcat (str, st [j]);

недопустимо, второй аргумент являетсясимвол, а не строка

Обратите внимание, что из предыдущих проблем существует защита от чтения / записи массивов через недопустимый индекс (слишком большой для двух массивов или также отрицательный для st в случае, если выражение имеет слишком много ')')

Вероятно, st должен быть массивом char*, а не массивом char (дляизменить его тип недостаточно для правильного кода)


Кажется, вы хотите разобрать выражение, но каких результатов вы ожидаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...