2017-02-16 35 views
1

Вот программа:.ПРОГР, который печатает длину строки в C

#include <stdio.h> 
#define BUF_LEN 200 
#define LINE_NUMBER 3 

int line_len(char* filename, int n) 
{ 
    FILE* f; 
    char buf[BUF_LEN]; 
    int j, i = 0; 
    if ((f = fopen(filename, "r"))) 
    { 
     for (j = 0; j < n; j++) 
      fgets(buf, BUF_LEN, f); 
     for (i = 0; buf[i]; i++) /* find end of buf */ ; 
     fclose(f); 
    } 
    return i; 
} 

int main() 
{ 
    printf("%d\n", line_len("test.txt", LINE_NUMBER)); 
    return 0; 
} 

Из того, что я понимаю, функция line_len получает имя файла и номер строки, мы заинтересованы в этом затем открывает файл в режиме только для чтения и итерации до достижения линии n через каждую итерацию, считывая BUF_LEN-1 символов из файла f и сохраняя эти символы в buf. Поэтому, когда первый для цикла прерывается, buf будет содержать все символы первых строк n.

Я не понимаю необходимость второго цикла. Когда он заканчивается? Как работает эта функция? Если в конце первого цикла цикла buf будет содержать символы первых строк n, тогда как эта функция возвращает длину строки n?

Заранее благодарен!

+0

Вы забыли написать какие-либо строки кода? – Marievi

+0

Код действительно работает, не так ли? –

+2

Первый цикл 'for' добавляет каждый символ строки n в массив buf. Второй цикл 'for' подсчитывает длину массива buf (i) и возвращает это. – Forklift

ответ

5

Я не понимаю необходимости во втором цикле. Когда он заканчивается?

Вторая петля имеет buf[i] как условие цикла. Он будет продолжать выполнение, пока buf[i] верен, то есть не равен нулю. Поэтому, когда он добирается до нулевого символа в конце строки (добавляется fgets()), цикл завершается.

Как работает эта функция?

Упрощается, он читает строки n. Каждая строка помещается в буфер, перегружая предыдущую строку. После чтения строк n он подсчитывает символы в буфере, когда он читает n-ю строку.

Это плохой код. Нет ошибки при вызове fgets, и если в n-й строке содержится более 199 символов, это даст неправильный ответ. Фактически, если вы считаете длину строки, чтобы исключить фид строки, он всегда получает неправильный ответ.

Он также возвращает нуль , если файл имеет менее n строк и, если не удалось открыть файл. Если возникает ошибка при чтении строки, она возвращает неопределенное число, и если она закончится с конца файла, будет возвращена длина последней строки.

В этих случаях результат ошибки будет лучше.

+0

@chux Хороший улов. В конце файла буфер остается неизменным и является «неопределенным» в случае других ошибок. Я исправлю ответ. – JeremyP

+0

Спасибо большое! Он перезаписывает его, это делает вещи намного яснее. Всего две вещи: 1- Как я могу узнать, что каждая строка перезаписывает предыдущую строку, я имею в виду, как я могу узнать, что строка не добавляется в буфер? 2- если второй цикл завершается, как только он встречает «\ 0», то не будет ли он прерваться после прочтения первой строки строки n-1 вместо чтения всей строки? – Tree

+0

@Tree Point 1 Прочитайте [справочную страницу] (https://linux.die.net/man/3/fgets). Если он не говорит, что он добавляет в буфер, вы всегда можете предположить, что он перезаписывает то, что было раньше. – JeremyP