我正在处理这样一个问题:我有一个包含行词的输入文件,我想用3D-Array逐行存储所有单词。但是我的代码似乎有些问题,我认为我无法看到分段错误发生的地方。这是我的代码:澄清:
" 字符*输入"是文件名 | "的 MAX_WORDS "是一个相当于 500 |的宏 "的 MAX_WLENGTH "是另一个宏,相当于 64 。
void func(char *input){
FILE *fp;
fp = fopen(input, "r");
char buffer[MAX_WORDS][MAX_WORDS][MAX_WLENGTH];
if(fp != NULL){
int c;
size_t i = 0;
size_t x = 0;
size_t y = 0;
for(;;){
c = fgetc(fp);
if(c != EOF && c != '\n' && c != ' '){
if(i < MAX_WLENGTH -1){
buffer[y][x][i++] = c;
}
continue;
}
if (i > 0){
buffer[y][x][i] = '\0';
if(c == '\n'){
y++;
x = 0;
i = 0;
}
else if(c == ' '){
x++;
i = 0;
}
}
if(c == EOF){
break;
}
}
fclose(fp);
}
int i;
int j;
for(i = 0; i < MAX_WORDS; ++i){
printf("\n");
for(j=0; j < MAX_WORDS; ++j){
printf("%s\t", strdup(buffer[i][j]));
}
}
}
答案 0 :(得分:0)
您没有检查输入文件的字数是否超过MAX_WORDS * MAX_WORDS(4096字)。因此,如果您的输入文件有更多单词,那么您正在尝试访问位置缓冲区[y] [x] [i],其中y或x可能大于64,这可能会导致分段错误。使用以下代码而不仅仅是y ++;或x ++;
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(390, 244)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 390, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.toolBar = QtGui.QToolBar(MainWindow)
self.toolBar.setObjectName(_fromUtf8("toolBar"))
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.actionTracar = QtGui.QAction(MainWindow)
self.actionTracar.setObjectName(_fromUtf8("actionTracar"))
self.toolBar.addAction(self.actionTracar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None))
self.actionTracar.setText(_translate("MainWindow", "tracar", None))
self.actionTracar.setShortcut(_translate("MainWindow", "Ctrl+T", None))