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 に答える