0

主な問題は sem->i = a; の後です。yylex が呼び出され、c isalpha sem->s[i] = c; が呼び出されたときに使用されます。sem->s[i] が指すアドレスに問題があるため、動作しません。

詳細:だから私がやりたいのは、txtを開いてファイルの最後まで中身を読むことです。関数yylexで英数字(例:hello、example2 hello45a)の場合、ファイルの終わりまたは英数字ではないものが見つかるまで、各文字を配列(sem-> s [i])に入れます。関数 yylex で数字 (例: 5234254 example2: 5) の場合、各文字を配列 arithmoi[] に入れます。attoi の後、数字を sem->i に入れます。yylex の else if(isdigit(c)) 部分を削除すると、機能します (txt 内のすべての単語が数字で始まらない場合)。とにかく、文字で始まる単語だけを見つけるとうまく機能します。次に、数値が見つかった場合(elseif(isdigit(c)部分を使用))、文字で始まる単語が見つかるまで機能します。それが起こると、書き込み場所に違反するアクセスがあり、問題は矢印がある場所にあるようです。あなたが私を助けることができれば、私は本当に感謝しています.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
using namespace std;

union SEMANTIC_INFO
{
    int i;
    char *s;
};


int yylex(FILE *fpointer, SEMANTIC_INFO *sem)
{
    char c;
    int i=0;
    int j=0;
    c = fgetc (fpointer);
    while(c != EOF)
    {
        if(isalpha(c))
        {
           do
           {
               sem->s[i] = c;//the problem is here... <-------------------
                       c = fgetc(fpointer); 
               i++;
           }while(isalnum(c));
        return 1;
        }
        else if(isdigit(c))
        {
            char arithmoi[20];
            do
            {
                arithmoi[j] = c;
                j++;
                c = fgetc(fpointer);
            }while(isdigit(c));
            sem->i = atoi(arithmoi); //when this is used the sem->s[i] in if(isalpha) doesn't work
            return 2;
        }
    }
    cout << "end of file" << endl;
    return 0;
}

int main()
{
    int i,k;
    char c[20];
    int counter1 = 0;
    int counter2 = 0;
    for(i=0; i < 20; i++)
    {
        c[i] = ' ';
    }
    SEMANTIC_INFO sematic;
    SEMANTIC_INFO *sema = &sematic;
    sematic.s = c;
    FILE *pFile;
    pFile = fopen ("piri.txt", "r");
    do
    {
       k = yylex( pFile, sema);
       if(k == 1)
       {
           counter1++;
           cout << "it's type is alfanumeric and it's: ";
          for(i=0; i<20; i++)
          {
              cout << sematic.s[i] << " " ;
          }
          cout <<endl;
          for(i=0; i < 20; i++)
          {
              c[i] = ' ';
          }
       }
       else if(k==2)
       {
           counter2++;
           cout << "it's type is digit and it's: "<< sematic.i << endl;

       }
    }while(k != 0);
    cout<<"the alfanumeric are : " << counter1 << endl;
    cout<<"the digits are: " << counter2 << endl;
    fclose (pFile);
    system("pause");
    return 0;
}
4

1 に答える 1

0

この行mainは、初期化されていないものを作成しています SEMANTIC_INFO

SEMANTIC_INFO sematic;

整数の値sematic.iは不明です。

ポインタの値sematic.sは不明です。

次に、に書き込もうとしますsematic.s[0]。あなたはそれsematic.sがそのファイルの内容を保持するのに十分な大きさの書き込み可能なメモリを指していることを望んでいますが、あなたはそれを何も指し示していません。

于 2013-03-07T19:48:32.760 に答える