主な問題は 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;
}