- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
#include <stdio.h>
#define MAXLINE 1000 /* максимальная длина строки в потоке */
int getline(char line[], int maxline);
main()
{
int len; /* длина текущей строки */
char line[MAXLINE]; /* текущая введённая строка */
while((len = getline(line, MAXLINE)) != (-1))
printf("%s", line);
system("PAUSE");
return 0;
}
/* getline: считывает строку в s, удаляет пробелы и знаки табуляции в конце строки, возвращает её длину. Удаляет полностью пустые строки */
getline(char s[], int lim)
{
int c, i;
for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == EOF)
return (-1); /* конец ввода */
else if (c == '\n') {
while(s[i-1] == ' ' || s[i-1] == '\t') /* "удаление" пробелов и знаков табуляции в конце строки */
--i;
if (i > 0) { /* если строка непустая */
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
}
Задача: убирать в конце каждой строки лишние пробелы и знаки табуляции, удалять полностью пустые строки.
Решение: при считывании строки вида "abc_____\n" на выходе получаем массив символов "abc\n\0___" (пробелы в конце). Печатаем строки по мере поступления, профит.
Говнокод или нормально?
Steve_Brown 12.03.2012 12:24 # +2
defecate-plusplus 12.03.2012 12:31 # +5
2) если хочешь пыщьпыщь производительности, то следи за позицией последнего введенного непробельного символа еще в цикле чтения, где getchar
3) не ну я понимаю, что это хтонический Си, но опускать возвращаемый тип в определении тела функции - некрасиво
justanothernickname 13.03.2012 07:50 # 0
2) Да, пожалуй, так и надо делать.
3) Спасибо за замечание. Пока что только учусь, поэтому правильное оформление ещё не вошло в привычку.
UncleAli 12.03.2012 13:36 # +2
TheCalligrapher 12.03.2012 16:15 # +2
Какой-то частной программе, работающей на нескольких платформах, возможное различие в поведении текстовых потоков может мешать. Вот для того, чтобы изолироваться от таких различий и создать некий platform abstraction layer, может и пригодиться функция, которая и читает стоку из файла, и выкидиывает из нее лишние пробелы на конце. Т.е. это просто функция чтения строки, которая ведет себя на всех платформах одинаково.
(Понятно, что имя лучше дать другое. И внутренне можно реализовать через подфункции.)
UncleAli 12.03.2012 17:11 # 0
По поводу подфункций: а если надо будет еще сделать функцию, которая делает то же самое, но еще и в начале пробельные символы удаляет? И что, копипастить? Так что только подфункции, тут без вариантов.
Конечно, с ООП это решалось бы проще, через цепочку классов-фильтров. Се ля ви.
UncleAli 12.03.2012 13:41 # 0
Если абстрагироваться от исходного ГК, насколько оправдана такая замена?
на такое:
defecate-plusplus 12.03.2012 13:57 # +1
ну и !0 это даа, хаккир!
UncleAli 12.03.2012 17:16 # 0
Я как-то вообще не понял, о чем это.
> !0 это даа, хаккир
Дело вкуса, мне так очевиднее. Нужно значение, которое «не ноль», вот я и пишу !(не) 0(ноль)
eth0 12.03.2012 18:20 # 0
Теоретически, это должно быть ровно 4294967295 значений, полагая инт в 4 байта.
Кстати, любопытно, что !0 = 0!. Это что-нибудь, да значит.
bugmenot 12.03.2012 19:29 # 0
* нормального булева типа нет,
* под False подразумевается 0,
* True := !False
guest 23.03.2012 14:33 # 0
Совершенно не проверяет на выход за пределы массива. И перед массивом вполне может быть пробел в памяти -> memory corruption.
guest8 09.04.2019 12:49 # −999