2015-08-13 6 views
0

Я пытаюсь определить, какие строки моего открытого текста начинаются с «linePrefix». Используя вышеприведенный код, даже если есть совпадение, strcmp никогда не возвращает 0. Кто-нибудь знает, где я сбой?Получить строки файла, начинающегося с префикса

const char PREFIX[] = {"linePrefix"}; 
    FILE *fp; 
    char *line = NULL; 
    char *aux = NULL; 
    aux = (char *) malloc(16); 
    size_t len = 0; 
    ssize_t read; 
    char path[] = {/*path*/}; 

    fp = fopen(path, "r"); 

    while ((read = getline(&line, &len, fp)) != -1) { 
    strncpy(aux, line, 15); 
    printf("strcmp: %i\n, strcmp(aux, PREFIX)); 
    } 
+0

[Пожалуйста, не бросайте результат 'таНос()'] (http://stackoverflow.com/a/605858/3233393). – Quentin

ответ

4

Вы забыли добавить строку терминатор на aux:

strncpy(aux, line, 15); 
aux[15] = `\0`; 

Обратите внимание, что есть более простой способ сделать сравнение, где вам не нужно скопировать строку. Просто сравните с началом line непосредственно:

while ((read = getline(&line, &len, fp)) != -1) { 
    printf("strcmp: %i\n, strncmp(line, PREFIX, strlen(PREFIX))); 
} 
+0

Хорошее предложение, но вместо 'strlen (PREFIX)' используйте 'sizeof (PREFIX) -1'. – Lundin

+0

@Lundin Это будет работать, пока PREFIX объявлен как массив. –

+0

@ KlasLindbäck Любая причина, почему этого не будет? Вы также можете написать 'sizeof (" linePrefix ") - 1', но это сделает код уродливым. – Lundin

0

Скорее всего, строки длиннее 15 символов, и в этом случае strncpy() перерывы. strncpy ведет себя как:

Если массив, на который указывает s2 является строкой, которая короче, чем п символов, нулевые символы прикрепляемой к копии в массиве, на который указывает s1, пока п символов вообще не было написан.

Другими словами, если нет места, strncpy не будет завершать работу программы, что приведет к ее сбою и сбою. Поэтому избегайте strncpy(), это опасная функция, которую программисты часто не могут использовать правильно.

Лучше код:

size_t length = strlen(line); 

if(length > MAX_LENGTH) 
{ 
    length = MAX_LENGTH; 
} 

memcpy(aux, line, length); 
aux[length] = '\0';