主要问题是在sem-> i = a之后;当yylex被调用而c isalpha时使用 sem-> s [i] = c;不起作用,因为sem-> s [i]与它指向的地址存在问题。
更多细节: 所以我想要做的是打开一个txt并读取它内部的内容,直到文件结束。 如果它是函数yylex的alfanumeric(例如:hello,example2 hello45a),我将每个字符放入一个数组(sem-> s [i]),直到我找到文件末尾或不是alfanumeric的东西。 如果它是函数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;
}
答案 0 :(得分:0)
main
中的这一行正在创建未初始化 SEMANTIC_INFO
SEMANTIC_INFO sematic;
整数sematic.i
的值未知。
指针sematic.s
的值未知。
然后尝试写信至sematic.s[0]
。你希望sematic.s
指向可写内存,大到足以保存该文件的内容,但你没有指出任何东西。