Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

17. Массивы строк

Массив строк представляет собой обычный двумерный массив символов. При этом обязательно должно выполняться одно условие – в каждой строке такого массива должен быть ноль-символ, который определяет конец соответствующей строки массива.

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

char mas[5][10]; // будет выделена память для хранения 5 строк, каждая

// из которых может иметь длину до 9 символов.

// Первоначально содержится случайная информация

200

?

?

?

?

?

?

?

?

?

?

210

?

?

?

?

?

?

?

?

?

?

220

?

?

?

?

?

?

?

?

?

?

230

?

?

?

?

?

?

?

?

?

?

240

?

?

?

?

?

?

?

?

?

?

Чтобы этот массив стал массивом строк, в каждой строке должен появиться ноль-символ. Тогда строкой будет все то, что находится в соответствующей строке массива до ноль-символа.

mas[0][0]=‘G’; mas[0][1]=‘G’; mas[0][2]=‘U’; mas[0][3]=0;

for (i=1; i<5; i++)

mas[i][0]=0;

200

G

G

U

0

?

?

?

?

?

?

210

0

?

?

?

?

?

?

?

?

?

220

0

?

?

?

?

?

?

?

?

?

230

0

?

?

?

?

?

?

?

?

?

240

0

?

?

?

?

?

?

?

?

?

Имеем одну строку "GGU" (mas[0]) и четыре пустые строки (mas[1], mas[2], mas[3], mas[4]). Т.е. имя массива с одним индексом является строкой символов.

Массив строк можно инициализировать при описании:

char mas [5][10] = {“май”, “июль”, “август”};

200

м

а

й

0

0

0

0

0

0

0

210

и

ю

л

ь

0

0

0

0

0

0

220

а

в

г

у

с

т

0

0

0

0

230

0

0

0

0

0

0

0

0

0

0

240

0

0

0

0

0

0

0

0

0

0

Или так (количество строк определится автоматически):

char mas[][10]={"май", "июль", "август"};

200

м

а

й

0

0

0

0

0

0

0

210

и

ю

л

ь

0

0

0

0

0

0

220

а

в

г

у

с

т

0

0

0

0

При работе с массивом строк удобно использовать массивы указателей. Память выделяется для 3 указателей (по 4 байта на каждый, например). В каждый указатель занесется адрес соответствующей константы. Правда такие строки нельзя изменять, иначе запортятся константы.

char *mas[3]={"май", "июль", "август"};

200

500

504

509

212

500

м

а

й

0

504

и

ю

л

ь

0

509

а

в

г

у

с

т

0

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

Задача. Ввести и вывести массив строк. Конец ввода – пустая строка.

void main() {

int n = 0, i;

char s[10][80];

gets(s[n]);

while (s[n][0] != 0) { //*s[n]

n++;

gets(s[n]);

}

for (i=0; i<n; i++)

puts(s[i]);

}

======= второй вариант ============================

void main() {

int n = 0, i;

char s[10][80];

while (*gets(s[n])) // gets возвращает адрес строки s[n]

n++;

for (i=0; i<n; i++)

puts(*(s+i)); //адрес строки содержится в s[i]

}

Задача. Дано предложение. Сформировать массив слов из слов предложения.

void main() {

int n=0, i=0, j=0;

char s[80], w[10][80];

gets(s);

while (s[i]!=0) {

while(s[i]==' ')

i++;

if (s[i]==0) break; // чтобы не пропустить 0-символ

while (s[i]!=' ' && s[i]!=0) {

w[n][j]=s[i];

j++;

i++;

}

w[n][j]=0;

n++;

j=0;

}

for (i=0; i<n; i++)

puts(w[i]);

}

======= второй вариант ============================

void main(void){

char s[80],w[20][80];

int i=0,j,n=0;

gets(s);

while(s[i]){

while(s[i]==' ') i++;

if(!s[i])

break;

for(j=0; s[i]!=' ' && s[i]; w[n][j++]=s[i++]);

w[n++][j]=0;

}

}