Объявление и инициализация строк. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Объявление и инициализация строк.



Строкой называется массив символов, который заканчивается пустым символом ‘\0’. Строка объявляется как обычный символьный массив, например,

char s1[10]; // строка длиной в девять символов

char *s2; // указатель на строку

Различие между указателями s1 и s2 заключается в том, что указатель s1 является именованной константой, а указатель s2 – переменной.

Строковые константы заключаются в двойные кавычки в отличие от символов, которые заключаются в одинарные кавычки.

Например, “This is a string.”

Длина строковой константы не может превышать 509 символов по стандарту. Однако, многие реализации допускают строки большей длины.

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

char s1[ ] = “This is a string.”;

В языке программирования С для работы со строками существует большое количество функций, прототипы которых описаны в заголовочных файлах stdlib.h и string.h. Работа с этими функциями будет рассмотрена в следующих параграфах.

 

Ввод-вывод строк.

Для ввода строки с консоли служит функция

char* gets (char *str);

которая записывает строку по адресу str и возвращает адрес введенной строки. Функция прекращает ввод, если встретит символ ‘\n’ или EOF (конец файла). Символ перехода на новую строку не копируется. В конец прочитанной строки помещается нулевой байт. В случае успеха функция возвращает указатель на прочитанную строку, а в случае неудачи NULL.

Для вывода строки на консоль служит стандартная функция

int puts (const char *s);

которая в случае удачи возвращает неотрицательное число, а в случае неудачи – EOF.

Прототипы функций gets и puts описаны в заголовочном файле stdio.h.

Пример.

#include <stdio.h>

int main()

{

char str[80];

printf("Input String: ");

gets(str);

puts(str);

return 1;

}

 

Форматированный ввод-вывод.

Для форматированного ввода данных с консоли используется функция

int scanf (const char *format, …);

которая в случае успешного завершения возвращает количество единиц прочитанных данных, а в случае неудачи – EOF. Параметр format должен указывать на форматируемую строку, которая содержит спецификации форматов ввода. Количество и типы аргументов, которые следуют после строки форматирования, должны соответствовать количеству и типам форматов ввода, заданным в строке форматирования. Если это условие не выполняется, то результат работы функции непредсказуем.

Пробел, символы '\t' или '\n' в форматной строке описывают один или более пустых символов во входном потоке, к которым относятся символы: пробел, ‘\t’, ‘\n’, ‘\v’, ‘\f’. Функция scanf пропускает пустые символы во входном потоке.

Литеральные символы в форматной строке, за исключением символа %, требуют, чтобы во входном потоке появились точно такие же символы. Если такого символа нет, то функция scanf прекращает ввод. Функция scanf пропускает литеральные символы.

В общем случае спецификация формата ввода имеет вид:

%[*] [ширина] [модификаторы] тип

где

- символ ‘*’ обозначает пропуск при вводе поля, определенного данной спецификацией;

- ‘ширина’ определяет максимальное число символов, вводимых по данной спецификации;

- ‘модификаторы’ уточняют тип аргументов;

- ‘тип’ определяет тип аргумента.

Тип может принимать следующие значения:

c – символьный массив,

s – строка символов, строки разделяются пустыми символами,

d – целое число со знаком в 10 с/c,

i – целое число со знаком, система счисления завит от двух первых цифр,

u – целое число без знака в 10 с/с,

o – целое число без знака в 8 с/c,

х, Х – целое число без знака в 16 с/с,

e, E, f, g, G – плавающее число,

p – указатель на указатель,

n – указатель на целое,

 […] – массив сканируемых символов, например, [A321].

В последнем случае из входного потока будут вводиться только символы, заключенные в квадратные скобки. Если первый символ внутри квадратных скобок равен ‘^’, то вводятся только те символы, которые не входят в массив. Диапазон символов в массиве задается через символ ‘-‘. При вводе символов ведущие пустые символы и завершающий нулевой байт строки также вводятся.

Модификаторы могут принимать следующие значения:

h – короткое целое,

l, L – длинное целое или плавающее,

и используются только для целых или плавающих чисел.

В следующем примере показаны варианты использования функции scanf. Перед спецификатором формата, начиная с ввода плавающего числа, стоит символ пробел.

#include <stdio.h>

int main()

{

int n;

double d = 0.0;

char c;

char* s;

printf("Input an integer: ");

scanf("%d", &n);

printf("Input a double: ");

scanf(" %lf", &d);

printf("Input a char: ");

scanf(" %c", &c);

printf("Input a string: ");

scanf(" %s", &s);

return 1;

}

Обратите внимание, что в этой программе число с плавающей точкой проинициализировано. Это сделано для того, чтобы компилятор подключил библиотеку для поддержки работы с плавающими числами. Если этого не сделать, то на этапе выполнения при вводе плавающего числа произойдет ошибка.

Для форматированного вывода данных на консоль используется функция

int printf (const char *format, …);

которая в случае успешного завершения возвращает количество единиц выведенных данных, а в случае неудачи – EOF. Параметр format представляет собой форматируемую строку, которая содержит спецификации форматов вывода. Количество и типы аргументов, которые следуют после строки форматирования, должны соответствовать количеству и типам спецификациям формата вывода, заданным в строке форматирования. В общем случае спецификация формата вывода имеет вид:

%[флаги] [ширина] [.точность] [модификаторы] тип

где

- ‘флаги’ – это различные символы, уточняющие формат вывода;

- ‘ширина’ определяет минимальное количество символов, выводимых по данной спецификации;

- ‘.точность’ определяет максимальное число выводимых символов;

- ‘модификаторы’ уточняют тип аргументов;

- ‘тип’ определяет тип аргумента.

Для вывода целых чисел со знаком используется следующий формат вывода:

%[-] [+ | пробел] [ширина] [l] d

где

- – выравнивание влево, по умолчанию – вправо;

+ – выводится знак ‘+’, заметим, что для отрицательных чисел всегда выводится знак ‘-‘;

‘пробел’ – в позиции знака выводится пробел;

l – модификатор типа данных long;

d – тип данных int.

Для вывода целых чисел без знака используется следующий формат вывода:

%[-] [#] [ширина] [l] [u | o | x | X]

где

# – выводится начальный 0 для чисел в 8 c/c или начальные 0x или 0X для чисел в 16 c/c,

l – модификатор типа данных long;

u – целое число в 10c/c,

o – целое число в 8 c/c,

x, X – целое число в 16 c/c.

Для вывода чисел с плавающей точкой используется следующий формат вывода:

%[-] [+ | пробел] [ширина] [.точность] [f | e | E | g | G]

где

'точность' – обозначает число цифр после десятичной точки для форматов f, e и E или число значащих цифр для форматов g и G. Числа округляются отбрасыванием. По умолчанию принимается точность в шесть десятичных цифр;

f – число с фиксированной точкой,

e – число в экспоненциальной форме, экспонента обозначается буквой 'e',

E – число в экспоненциальной форме, экспонента обозначается буквой 'E',

g – наиболее короткий из форматов f или g,

G – наиболее короткий из форматов f или G.

Пример.

printf ("n = %d\n f = %f\n e = %e\n E = %E\n f = %.2f", -123, 12.34, 12.34, 12.34, 12.34);

// печатает: n = 123 f = 12.340000 e = 1.234000e+001 E = 1.234000E+001 f = 12.34

Форматирование строк.

Существуют варианты функций scanf и printf, которые предназначены для форматирования строк и называются соответственно sscanf и sprintf.

Функция

int sscanf (const char *str, const char *format, …);

читает данные из строки, заданной параметром str, в соответствии с форматной строкой, заданной параметром format. В случае удачи возвращает количество прочитанных данных, а в случае неудачи – EOF. Например,

#include <stdio.h>

int main()

{

char str[] = "a 10 1.2 String No input";

char c;

int n;

double d;

char s[80];

sscanf(str, "%c %d %lf %s", &c, &n, &d, s);

printf("%c\n", c); // печатает: a

printf("%d\n", n); // печатает: 10

printf("%f\n", d); // печатает: 1.200000

printf("%s\n", s); // печатает: String

return 1;

}

Функция

int sprintf (char *buffer, const char *format, …);

форматирует строку в соответствии с форматом, который задан параметром format и записывает полученный результат в символьный массив buffer. Возвращает функция количество символов, записанных в символьный массив buffer, исключая завершающий нулевой байт. Например,

#include <stdio.h>

int main()

{

char buffer[80];

char str[] = "c = %c, n = %d, d = %f, s = %s";

char c = 'c';

int n = 10;

double d = 1.2;

char s[] = "This is a string.";

sprintf(buffer, str, c, n, d, s);

printf("%s\n", buffer); // печатает: c = c, n = 10, d = 1.200000, s = This is a string

return 1;

}

 

Преобразование строк в числовые данные.

Прототипы функций преобразования строк в числовые данные приведены в заголовочном файле stdlib.h, который нужно включить в программу.

Для преобразования строки в целое число используется функция

int atoi (const char *str);

которая в случае успешного завершения возвращает целое число, в которое преобразована строка str, а в случае – неудачи 0. Например,

int n;

char *str = “-123”;

n = atoi (str); // n = -123

Для преобразования строки в длинное целое число используется функция

long int atol (const char *str);

которая в случае успешного завершения возвращает целое число, в которое преобразована строка str, а в случае – неудачи 0. Например,

long int n;

char *str = “-123”;

n = atol (str); // n = -123

Для преобразования строки в число типа double используется функция

double atof (const char *str);

которая в случае успешного завершения возвращает плавающее число типа double, в которое преобразована строка str, а в случае – неудачи 0. Например,

double n;

char *str = “-123.321”;

n = atof (str); // n = -123.321

Следующие функции выполняют действия, аналогичные функциям atoi, atol, atof, но предоставляют более широкие возможности.

Функция

long int strtol (const char *str, char **endptr, int base);

преобразует строку str в число типа long int, которое и возвращает. Параметры этой функции имеют следующее назначение.

Если аргумент base равен 0, то преобразование зависит от первых двух символов строки str:

- если первый символ – цифра от 1 до 9, то предполагается, что число представлено в 10 c/c;

- если первый символ – цифра 0, а второй – цифра от 1 до 7, то предполагается, что число представлено в 8 c/c;

- если первый символ 0, а второй – ‘Х’ или ‘х’, то предполагается, что число представлено в 16 c/c.

Если аргумент base равен числу от 2 до 36, то это значение принимается за основание системы счисления и любой символ, выходящий за рамки этой системы, прекращает преобразование. В системах счисления с основанием от 11 до 36 для обозначения цифр используются символы от ‘A’ до ‘Z’ или от ‘a’ до ‘z’.

Значение аргумента endptr устанавливается функцией strtol. Это значение содержит указатель на символ, который остановил преобразование строки str. В случае успешного завершения функция strtol возвращает преобразованное число, а в случае неудачи – 0.


 Например,

int main ()

{

long int n;

char *p;

n = strtol (“12a”, &p, 0);

printf (“ n = %ld, %stop = %c, n, *p);

// n = 12, stop = a

n = strtol (“012b”, &p, 0);

printf (“ n = %ld, %stop = %c, n, *p);

// n = 10, stop = b

n = strtol (“0x12z”, &p, 0);

printf (“ n = %ld, %stop = %c, n, *p);

// n = 18, stop = z

n = strtol (“01117”, &p, 0);

printf (“ n = %ld, %stop = %c, n, *p);

// n = 7, stop = 7

return 1;

}

Функция

unsigned long int strtol (const char *str, char **endptr, int base);

работает аналогично функции strtol, но преобразует символьное представление числа в число типа unsigned long int.

Функция

double strtod (const char *str, char **endptr);

преобразует символьное представление числа в число типа double.

Все функции, перечисленные в этом параграфе, прекращают свою работу при встрече первого символа, который не подходит под формат рассматриваемого числа.

Кроме того, в случае если символьное значение числа превосходит диапазон допустимых значений для соответствующего типа данных, то функции atof, strtol, strtoul, strtod устанавливают значение переменной errno в ERANGE. Переменная errno и константа ERANGE определены в заголовочном файле math.h. При этом функции atof и strtod возвращают значение HUGE_VAL, функция strtol возвращает значение LONG_MAX или LONG_MIN, а функция strtoul – значение ULONG_MAX.

Для преобразования числовых данных в символьные строки могут использоваться нестандартные функции itoa, ltoa, utoa, ecvt, fcvt и gcvt. Но лучше для этих целей использовать стандартную функцию sprintf.

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 114; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.22.107 (0.063 с.)