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


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


Напишите программу, которая объединяет и распечатывает две строки, введенные с терминала. Для ввода строк используйте функцию gets(), а для их объединения strcat(). В другом варианте используйте sprintf(result,"%s%s",s1,s2);

Модифицируйте предыдущую программу таким образом, чтобы она выдавала длину (число символов) объединенной строки. Используйте функцию strlen(). Приведем несколько версий реализации strlen:

/* При помощи индексации массива */ int strlen(s) char s[]; { int length = 0; for(; s[length] != '\0'; length++); return (length); } /* При помощи продвижения указателя */ int strlen(s) char *s; { int length; for(length=0; *s; length++, s++); return length; } /* При помощи разности указателей */ int strlen(register char *s) { register char *p = s; while(*p) p++; /* ищет конец строки */ return (p - s); }

Разность двух указателей на один и тот же тип - целое число:

если TYPE *p1, *p2; то p2 - p1 = целое число штук TYPE

лежащих между p2 и p1

если p2 = p1 + n

то p2 - p1 = n

Эта разность может быть и отрицательной если p2 < p1, то есть p2 указывает на более левый элемент массива.

Напишите оператор Си, который обрубает строку s до длины n букв.

Ответ:

if( strlen(s) > n ) s[n] = '\0';

Первое сравнение вообще говоря излишне. Оно написано лишь на тот случай, если строка s короче, чем n букв и хранится в массиве, который также короче n, т.е. не имеет nого элемента (поэтому в него нельзя производить запись признака конца).

Напишите функции преобразования строки, содержащей изображение целого числа, в само это число. В двух разных вариантах аргумент-адрес должен указывать на первый байт строки; на последний байт. Ответ:

#define isdigit(c) ('0' <= (c) && (c) <= '9') int atoi(s) register char *s; { register int res=0, neg=0; for(;;s++){ switch(*s){ case ' ': case '\t': continue; case '-': neg++; case '+': s++; } break; } while(isdigit(*s)) res = res * 10 + *s++ - '0'; return( neg ? -res : res ); } int backatoi(s) register char *s; { int res=0, pow=1; while(isdigit(*s)){ res += (*s-- - '0') * pow; pow *= 10; } if(*s == '-') res = -res; return res; }




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



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