Глава 1 K&R - решение для Упражнения 22, что Вы думаете?

Это может помочь:

ссылка

Запись в события

Если для allDay установлено значение 1, eventTimezone должен иметь значение Time.TIMEZONE_UTC и время должен соответствовать полуночной границе.

Переполнение стека

10
задан Georg Fritzsche 19 June 2010 в 19:36
поделиться

4 ответа

Я уверен, что вы на правильном пути, но некоторые указатели для удобочитаемости:

  • прокомментируйте ваши вещи
  • присвойте переменным правильное имя и, по крайней мере, дайте описание, если вы откажетесь
  • быть последовательным, некоторые однострочные if вы используете, а некоторые нет. (imho, всегда используйте {}, чтобы он был более читабельным)
  • оператор if в последнем цикле for может быть лучше, например

    if(array[0] != NEWLINE)  
    {   
        printf("%c", array[line]); 
    }
7
ответ дан 4 December 2019 в 01:58
поделиться

ИМХО это нехорошо.

Во-первых, он не делает то, о чем вас просили. Вы должны были найти последний пробел после непустого перед границей выходной линии. Ваша программа даже не пытается это сделать удаленно, похоже, она пытается найти первые пробелы после (поля - 5) символов (откуда взялись 5? Что, если все слова имеют 9 букв?). Однако он также не делает этого из-за ваших манипуляций с переменной newls. Кроме того, это:

for(line = 0; line < i; line++) {
    if(array[0] == NEWLINE)
        ;
    else
        printf("%c", array[line]);
}

, вероятно, неправильно, потому что вы проверяете условие, которое никогда не меняется в цикле.

И, наконец, что не менее важно, сохранение всего файла в буфере фиксированного размера не очень хорошо, потому что две причины:

  • буфер переполнен большими файлами
  • , даже если он никогда не переполнится, люди все равно не будут ' T как вы для хранения, например. гигабайтный файл в памяти, просто чтобы разрезать его на 25-символьные куски

Я думаю, вам следует начать заново, переосмыслить свой алгоритм (включая угловые случаи) и только после этого начинать кодирование. Я предлагаю вам:

  • обрабатывать файл построчно (имеется в виду выходные строки)
  • сохранять строку в буфере, достаточно большом, чтобы вместить наибольшую выходную строку
  • искать символ, на котором вы разбиваете в буфер
  • , затем распечатайте его (подсказка: вы можете завершить строку с помощью '\ 0' и распечатать с помощью printf ("% s", ...) ), скопировать то, что вы не печатали к началу буфера, перейдите от этого
2
ответ дан 4 December 2019 в 01:58
поделиться

Выглядит (без тестирования), как будто это может работать, но кажется, что это довольно сложно.

Вот некоторый псевдокод для моей первой мысли

const int MAXLINE = ??  — maximum line length parameter
int chrIdx = 0 — index of the current character being considered 
int cand = -1  — "candidate index",  Set to a potential break character
char linebuf[bufsiz]
int lineIdx = 0 — index into the output line
char buffer[bufsiz]   — a character buffer
read input into buffer
for ix = 0 to bufsiz -1
do     
   if buffer[ix] == ' ' then
      cand = ix
   fi
   linebuf[lineIdx] = buffer[ix]
   lineIdx += 1
   if lineIdx >= MAXLINE then
      linebuf[cand] = NULL — end the string
      print linebuf
      do something to move remnants to front of line (memmove?)
   fi
 od

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

0
ответ дан 4 December 2019 в 01:58
поделиться

Очевидная проблема заключается в том, что вы статически выделяете «массив» и никогда не проверяете пределы индекса при доступе к нему. Переполнение буфера в ожидании. На самом деле, вы никогда не сбрасываете переменную i в первом цикле, поэтому я не совсем понимаю, как должна работать программа. Похоже, что вы сохраняете весь ввод в памяти до того, как напечатать его в переносе слов?

Итак, предложения: объедините два цикла вместе и напечатайте вывод для каждой завершенной строки. Затем вы можете повторно использовать массив для следующей строки.

Да, и лучше имена переменных и некоторые комментарии. Я понятия не имею, что должен делать «DELIM».

0
ответ дан 4 December 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: