LINUX.ORG.RU

небольшой вопрос по С.


0

0

подскажите, как в С правильнее сделать следующую вещь:
допустим, при печати строчки встречается пробельный символ.
его печатать не надо.
вот примерный код:

if (c == ' ' || c == '\n' || c == '\t') {
?;
}

вопрос собственно в том, как правильнее "пропустить" target-символ
и печатать строчку дальше ?

anonymous

Наверное так...

char *string = "Linux Org Ru";

int i = 0;

for(i = 0; i < strlen(string); i++) {

char *c = (string + i);

if(*c == ' ' || *c = '\n') continue;

printf("%c", *c);

}

LestorN
()

man isspace

anonymous
()

Спасибо, товарищи! =)

anonymous
()
Ответ на: комментарий от LestorN

замечательно, strlen будет вызываться на каждой итерации цикла. а потом кто-то жалуется на производительность и предлагает в glibc включить "объект" "строка" (см топик в talks :) )

Reset ★★★★★
()
Ответ на: комментарий от Reset

у твоей func есть сайд эффект:)

Хороший оптимизатор может сообразить что у strlen нет сайдэффекта и ее результат не изменится, и вызвать ее 1 раз

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

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

Reset ★★★★★
()

#define SPACES " \t"
#define BLANKS " \t\v\f\n\r"

/** при печати жрётЪ символы из заданного набора,
заменяя последовательность символов одним (a-la html)
*/
inline void puts_collapsed(char *str,char *symset) {
	while(*str) {
		if (strchr(symset,*str)) {
			putchar(*symset);
			str+=strspn(str,symset);
		} else {
			putchar(*str);
			str++;	
		}
	}
}

PS если надо анализировать ВСЕ символы строки, то не стоит использовать функцию strlen - ориентируйтесь по символу конца строки.


anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.