读取行的单词并在3D Array中存储单词

时间:2016-02-13 17:56:46

标签: c string file multidimensional-array

我正在处理这样一个问题:我有一个包含行词的输入文件,我想用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]));
         }
    }
 }

1 个答案:

答案 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))