Объявление и инициализация

Строка представляет собой массив символов, поэтому и объявляется она именно как массив:

char s[80];

Однако строка отличается от массива тем, что она заканчивается символом с кодом 0 – признаком окончания строки, поэтому

Если массив символов будет использоваться как строка, надо выделять на 1 байт больше памяти.При выделении памяти глобальные переменные заполняются нулями, а локальные содержат«мусор». Начальное значение строки можно задать при объявлении в двойных кавычках после знака равенства:

char s[80] = "Привет, Вася!";

Символы в кавычках будут записаны в начало массива s, а затем – признак окончания строки '\0'. Оставшиеся символы не меняются, и в локальных строках там будет «мусор». Можно написать и так

char s[] = "Привет, Вася!";

В этом случае компилятор подсчитает символы в кавычках, выделит памяти на 1 байт больше и занесет в эту область саму строку и завершающий ноль. Аналогично можно выделить память на указатель:

char *s = "Привет, Вася!"; __

Результат – тот же самый, что и в предыдущем случае, но теперь s – это указатель (переменная, в которой хранится адрес ячейки в памяти), и с ним можно работать так же, как с обычным указателем (присваивать, изменять и т.п.). Если строка не будет изменяться во время работы программы, то можно объявить константу (постоянную строку) так:

const char PRIVET[] = "Привет, Вася!";

Стандартный ввод и вывод

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

формат "%s":

#include <stdio.h>

Main()

{

char Name[50];

printf("Кактебязовут? ");

scanf("%s", Name);

printf("Привет, %s!", Name);

}

Заметьте, что в функцию scanf надо передать просто имя строки (без знака &), ведь имя массива является одновременно адресом его начального элемента.

Однако у функции scanf есть одна особенность: она заканчивает ввод, встретив первый

пробел. Если вы на вопрос в предыдущем примере ввели "Вася Пупкин", то увидите надпись

"Привет, Вася!" вместо ожидаемого "Привет, Вася Пупкин!". Если надо ввести всю

строку целиком, включая пробелы (то есть до нажатия на клавишу Enter), придется делать иначе, заменив вызов scanf на более простой:

gets (s);

Название этой функции происходит от английских слов get string – получить строку.

Для вывода строки на экран можно (кроме printf) использовать и функцию puts, которая после вывода строки еще и дает команду перехода на новую строку. В примере значение

строки Name будет напечатано на следующей строчке экрана.

#include <stdio.h>

Main()

{

char Name[50] = "Вася!";

puts("Привет,");

puts (Name);

}

Пример. Ввести символьную строку и заменить в ней все буквы 'A' на буквы 'Б'.

Будем рассматривать строку как массив символов. Надо перебрать все элементы массива,

пока мы не встретим символ '\0' (признак окончания строки) и, если очередной символ – это буква 'A', заменить его на 'Б'. Для этого используем цикл while, потому что мы заранее не знаем длину строки. Условие цикла можно сформулировать так: «пока не конец строки».

Заметьте, что

Одиночный символ записывается в апострофах, а символьная строка – в кавычках.

При выводе строк с помощью функции printf часто применяется форматирование. После знака % в формате указывается размер поля для вывода строки. Перед этим числом можно также поставить знак минус, что означает «прижать к левому краю поля».

Работа с файлами

В реальной ситуации требуется обрабатывать очень много строк, которые чаще всего на-

ходятся в файле, причем их количество заранее неизвестно. Однако, если для обработки одной строки нам не требуется знать остальные, можно использовать способ, который мы применяли при работе с массивами данных неизвестного размера. В данном случае мы будем читать очередную строку из файла, обрабатывать ее и сразу записывать в выходной файл (если это требуется).

Работа с файлами имеет несколько особенностей. Во-первых, для чтения строки можно

использовать функцию fscanf. Однако эта функция читает только одно слово и останавливается на первом пробеле. Поэтому функция fscanf применяется тогда, когда надо читать файл по словам.Вот пример чтения слова из открытого файла с указателем fp:

Если надо читать всю строку с пробелами, используют функцию fgets. Она принимает

три параметра:

имя символьной строки, в которую записать данные;

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

если строка в файле длиннее, чем можно записать в память, читается только начальная

часть, а остальное – при следующих вызовах fgets;

указатель на файл.

Если функция fgets не может прочитать строку из файла (например, если нет больше строк),то она возвращает в качестве результата специальное значение NULL. Это свойство можно использовать для обработки ошибок и прекращения ввода данных.

#include <stdio.h>

Main()

{

char s[80];

FILE *fp;

fp = fopen ("input.dat", "r");

if (NULL == fgets (s, 80, fp))

printf ("Не удалось прочитать строку");

Else

printf ("Перваястрокафайла - %s", s);

fclose (fp);

}

Функция fgets читает строку из файла, пока не случится одно из двух событий:

• встретится символ перехода на новую строку '\n';

• прочитано столько символов, что они заняли всю строку (с учетом последнего нуля), например, в нашем случае она остановится, если прочтет 79 символов.

В конце строки будет поставлен символ '\0'. Кроме того, если был найден символ перехода на новую строку '\n', он сохраняется и в строке s .

Пример. В каждой строке файла input.dat заменить все буквы 'A' на 'Б' и вывести изме-

ненный текст в файл output.dat. Обратите внимание, что в этой задаче файл может быть любой длины. Но мы можем обрабатывать строки последовательно одну за другой, так как для обработки одной строки не нужны предыдущие и следующие.

Для чтения из файла используем цикл while. Он заканчивает работу, если функция

fgets вернет значение NULL, то есть все строки обработаны.

#include <stdio.h>

Main()

{

char s[80];

int i;

FILE *fin, *fout;

fin = fopen ("input.dat", "r");

fout = fopen ("output.dat", "w");

while (NULL!= fgets (s, 80, fin)) // читаемстроку

{

i = 0; // начинаемсs[0]

while (s[i]!= '\0') { // пока не конец строки

if (s[i] == 'А') s[i] = 'Б'; // меняемсимвол

i ++; // переходим к следующему символу

}

fprintf (fout, "%s", s); // выводим строку в файл

}

fclose (fin);

fclose (fout);

}

Обратите внимание, что мы не поставили символ перехода на новую строку при вызове

функции fprintf. Это связано с тем, что при чтении функция fgets сохраняет символ '\n'

в конце каждой строки (кроме последней), поэтому строки будут выведены в выходной файл так же, как они были записаны в исходном файле.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: