функция strstr C работает ненормально - PullRequest
1 голос
/ 09 сентября 2011

Для запуска проекта C цель состоит в том, чтобы прочитать файл CSV с первыми двумя строками, перечисляющими длину строки и столбца, как

attributes: 23
lines: 1000
e,x,y,n,t,l,f,c,b,p,e,r,s,y,w,w,p,w,o,p,n,y,p
e,b,y,y,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,s,m
e,x,f,y,t,l,f,w,n,w,t,b,s,s,w,w,p,w,o,p,n,v,d
e,s,f,g,f,n,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,v,u

Дело в том, что я не знаю, будут ли будущие входные данные файла иметь одинаковую длину строки / столбца, поэтому я реализую функцию determineFormat для чтения этих первых двух строк, которые будут использоваться для построения структуры данных.

Для этого мне нужно сопоставить подстроку с текущей строкой. Если это совпадает, то fscanf используется для чтения в строке и извлечения целых чисел длины. Однако этот код не работает, так как вся функция strstr пропускается в ddd.

int lineCount, attrCount; //global variables

void determineFormats(FILE *incoming){

    char *curLine= emalloc(CLINPUT);
    int i;
    char *ptr=NULL;

    for (i=0; i<2; i++){
        if (fgets(curLine, CLINPUT, incoming) != NULL){
            ptr= strstr(curLine, "attrib");  //this line is skipped over

            if (ptr!= NULL)
                fscanf(incoming, "attributes: %d", &attrCount);

            else 
                fscanf(incoming, "lines: %d", &lineCount);  

        }
    }

    printf("Attribute Count for the input file is: %d\n", attrCount);
    printf("Line count is: %d\n", lineCount);

}

Я думаю о блоке if / else, поскольку эта функция интересна только двум строкам, и они обе находятся в начале файла, просто просканируйте каждую строку и проверьте, совпадает ли строка. Если это так, выполняется ненулевое условное выражение, в противном случае выполняется другое условное условие. Однако в этом случае функция strstr пропускается.

Дополнительная информация

Некоторые комментарии заставили меня вернуться и перепроверить.

CLINPUT определено равным 100, или примерно на 40% снова количеством символов для чтения из каждой строки.

Это вывод ddd при вызове ptr= strstr(curLine, "attrib");:

0xb7eeaff0 in strstr () from /lib/libc.so.6
Single stepping until exit from function strstr,
which has no line number information.

Как только это происходит, индикатор линии исчезает, и одиночный шаг (F5) из этой точки возвращается к вызывающей функции.

1 Ответ

2 голосов
/ 09 сентября 2011

strstr работает хорошо. Проблема в том, что fscanf будет читать следующую строку, поскольку текущий уже прочитан.

Вот более правильный путь

for (i=0; i<2; i++){
    if (fgets(curLine, CLINPUT, incoming) != NULL){
        if (strstr(curLine, "attributes:")) {
            sscanf(curLine, "attributes: %d", &attrCount);
        } else if (strstr(curLine, "lines:")) {
            sscanf(curLine, "lines: %d", &lineCount);  
        }

    }
}
...