- •Тема 7. Строки, потоки, файлы.
- •1. Строки.
- •1.1. Создание строк
- •1.2. Присваивание строк
- •1.3. Сравнение строк
- •1.4. Длина строки
- •1.5. Преобразования строк
- •1.6. Объединение строк
- •1.7. Другие функции для работы со строками
- •2. Файлы и потоки.
- •2.1. Понятие файла и потока.
- •2.2. Указатель на файл, открытие файла, обработка ошибок, закрытие файла, изменение режима открытия.
- •2.3. Чтение из файла и запись в файл
- •2.4. Позиционирование в потоке.
- •2.5. Контроль исполнения потоковых операций.
1.3. Сравнение строк
Для лексикографического сравнения строк используются функции strcmp и stricmp. Первая сравнивает строки с учетом регистра, вторая – без. Однако, все это относится только к латинице. Кириллические строки сравниваются только с учетом регистра. Прототипы этих функций таковы:
int stricmp(char *string1, char *string2);
int strcmp(char *string1, char *string2);
Обе функции возвращают число меньшее 0, если первая строка меньше второй, большее нуля если первая строка больше второй и 0, если строки лексикографически равны.
Следующие две функции сравнивают с учетом регистра и без не более size символов строки string1 и строки string2.
int strncmp(char *string1, char *string2, int size);
int strnicmp(char *string1, char *string2, int size);
1.4. Длина строки
Для вычисления длины строки используется функция
size_t strlen(const char *string);
Функция возвращает длину строки, не включая нуль-терминатор. Как всегда, следите за тем, чтобы в выделенной под string памяти все же нашелся такой символ. В противном случае функция выйдет за пределы выделенной памяти и все будет плохо. Напомню, что для определения длины строки функции придется последовательно обратиться ко всем ее символам до нуль-терминатора, а значит, потенциально эта операция довольно дорогая. Поэтому, не следует использовать эту функцию в циклах, то есть вместо
for (i=0;i<strlen(str);i++) {работа со строкой, не изменяющая ее длину}
больше подойдет примерно такой код :
char len;
len=strlen(str);
for (i=0;i<len;i++) { работа со строкой, не изменяющая ее длину }
1.5. Преобразования строк
Зачастую требуется преобразовать число в строку и наоборот. Есть несколько способов сделать это.
Во-первых, можно использовать функции sprintf и sscanf. Например, так:
char str[50];
int i=15;
int j;
sprintf(str, "%d", i); // Записать в str строковое представление i
sscanf(str, "%d", &j); // Записать в j число, содержащееся в строке str
sprintf(str, "i=%d and j=%d", i, j);
// содержимое str: "i=15 and j=15"
Эти функции очень похожи на printf и scanf, за исключением того, что они работают не с консолью, а со строковым буфером. Для дополнительной информации об этих функциях см. документацию.
Хотя sprintf и sscanf довольно удобны, у них есть несколько недостатков. Во-первых, они не всегда быстро работают, во-вторых, не типобезопасны. Например, если в строке формата вы укажите, что передаете два целых, а вместо этого передадите два double, ошибка обнаружится только при выполнении программы и найти ее причину будет не так-то просто.
В-третьих, доступно целое семейство функций atof, atoi, atol и itoa, ltoa (библиотека stdlib.h). Все они очень похоже между собой. Функции из первой группы преобразуют строку в число (float, int или long) в зависимости от окончания. Функции из второй группы выполняют обратное преобразование.
Прототипы функций из первой группы:
double atof(const char* string);
int atoi(const char* string);
long atol(const char* string);
Вторая группа:
char* itoa(int value, char* string, int radix);
char* ltoa(long value, char* string, int radix);
Функции из второй группы могут создавать строковое представление чисел в любой системе (по любому основанию) от 2 до 36. Основание передается в третьем параметре. Чтобы получить строковое представление числа в десятичной системе, передайте 10. Функции возвращают указатель на строку.
