【发布时间】:2016-10-25 15:33:34
【问题描述】:
我正在编写一个程序来将文件拆分为词位,但我不熟悉 C,并且遇到了一个奇怪的分段错误。以下代码运行并打印:
1
2
Segmentation Fault: 11
我查找了导致分段错误的其他原因,但在 2 之后我没有对数组做任何事情。我做错了什么?一个简单的赋值怎么会导致分段错误?
#include <stdio.h>
#define CHAR_CODE 1
#define NUM_CODE 2
#define RESERVED_CHAR_CODE 3
#define SPACE_CODE 4
#define ERR_CODE 5
char token[16];
char line[128];
int lineLen = 0;
int counter = 0;
FILE *file;
void cleanToken(){
for(int i = 0 ; i < 16; i++){
token[i] = 0;
}
}
void cleanLine(){
for(int i = 0 ; i < 128; i++){
line[i] = 0;
}
}
void next(){
cleanToken();
printf("1\n");
char c;
if(counter == lineLen){
printf("2\n");
lineLen = 0;
printf("3");
cleanLine();
printf("4");
counter = 0;
while((c=getc(file)) != 10 && c != EOF){
if(c!=32){
line[lineLen] = c;
lineLen++;
}
printf("%d\n", lineLen);
}
printf("%s\n", line);
}
c = line[counter];
int type = getType(c);
while(getType(c)==type){
token[counter] = c;
counter = counter + 1;
c = line[counter];
if(c == EOF | c == 4 | type == RESERVED_CHAR_CODE){
break;
}
}
}
int getType(int c){
if((c > 96 & c < 123) | (c>64 & c < 91)){
return CHAR_CODE;
} else if(c < 58 & c > 46){
return NUM_CODE;
} else if(c == 32){
return SPACE_CODE;
} else if(c == 33 | c == 34 | (c > 36 & c < 44) | c == 45 | c == 47 | (c > 58 & c < 63)){
return RESERVED_CHAR_CODE;
} else {
return ERR_CODE;
}
}
int main(){
int c;
FILE* file;
file = fopen("test.txt", "r");
for(int i = 0; i < 10 ;i++){
next();
printf("%s\n", token);
}
return 0;
}
【问题讨论】:
-
编译时启用所有警告。
-
您的
test.txt文件中有什么内容? -
请缩进你的代码,给我们一个最小的例子......也就是说,这样一个简单的
printf语句的段错误通常意味着你的token不是正确的空终止。 -
与您的问题无关,但您应该避免使用以下行中的幻数:
if(c == 33 | c == 34 | (c > 36 & c < 44) | c == 45 | c == 47 | (c > 58 & c < 63))。什么是33、34等?顺便说一句:你可以写'A',而不是写 65。 -
另外,我很确定您希望使用
||运算符(逻辑或)而不是|(按位或)。
标签: c