Хрестоматия по программированию на Си в Unix


Массивы, строки, указатели. Хрестоматия по программированию на Си в Unix - стр. 6


Какие значения возвращает функция strcmp() в следующей программе?

#include <stdio.h>

main() { printf("%d\n", strcmp("abc", "abc")); /* 0 */ printf("%d\n", strcmp("ab" , "abc")); /* -99 */ printf("%d\n", strcmp("abd", "abc")); /* 1 */ printf("%d\n", strcmp("abc", "abd")); /* -1 */ printf("%d\n", strcmp("abc", "abe")); /* -2 */ }

В качестве итога предыдущих задач: помните, что в Си строки (а не адреса) надо сравнивать как

if( strcmp("abc", "bcd") < 0) ... ; if( strcmp("abc", "bcd") == 0) ... ; вместо if( "abc" < "bcd" ) ... ; if( "abc" == "bcd" ) ... ;

и присваивать как

char d[80], s[80]; strcpy( d, s ); вместо d = s;

Напишите программу, которая сортирует по алфавиту и печатает следующие ключевые слова языка Си:

int char double long for while if

Вопрос не совсем про строки, скорее про цикл: чем плоха конструкция?

char s[] = "You're a smart boy, now shut up."; int i, len; for(i=0; i < strlen(s); i++) putchar(s[i]);

Ответ: в соответствии с семантикой Си цикл развернется примерно в

i=0; LOOP: if( !(i < strlen(s))) goto ENDLOOP; putchar(s[i]); i++; goto LOOP; ENDLOOP: ;

Заметьте, что хотя длина строки s не меняется, strlen(s) вычисляется на КАЖДОЙ итерации цикла, совершая лишнюю работу! Борьба с этим такова:

for(i=0, len=strlen(s); i < len; i++ ) putchar(s[i]); или

for(i=0, len=strlen(s); len > 0; i++, --len ) putchar(s[i]);

Аналогично, в цикле

while( i < strlen(s))...;

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

Что напечатает следующая программа?




- Начало -  - Назад -  - Вперед -



Книжный магазин