Блоги

Пример использования массива указателей (стр 124)

Массив months представляет собой массив указателей на первые символы строк. Например, months[3] содержит адрес на символ 'M', который можно получить так: *months[3].

Функция month_name возвращает указатель на первый символ строки. Но как ее получить всю по данному адресу? Ее можно считать в строку (массив символов), инкреминируя указатель, или просто посимвольно вывести на экран. Самый простой способ - это указать формат вывода "строка" (%s) для указателя на первый символ.

#include <stdio.h>
 
char *month_name (int n);
 
main () {
	int m, i;
	char *ch;
	char str[20];
// 1 ---------------------------------------------
	scanf("%d", &m);
	ch = month_name(m);
	i = 0;
	while (*ch != '\0') {
		str[i] = *ch;
		ch++;
		i++;
	}
	str[i] = '\0';
	printf("%s\n", str);
// 2 ---------------------------------------------
	scanf ("%d", &m);
	ch = month_name(m);
	while (*ch != '\0')

Язык Си. Указатели и массивы

Этот пример поможет закрепить понимание, как работать с указателем на массив. В выводе программы обратите внимание, адреса различаются между собой на 4 байта, т.е. переменная типа int занимает 4 байта. Также из примера можно удостовериться, что элементы массива располагаются в памяти последовательно друг за другом.

& - операция взятия адреса переменной;
* - операция извлечения значения по указанному адресу; применяется к переменным, содержащим адрес (т.е. к указателям).

Когда переменная-указатель объявляется (например, int *q), перед ее именем также ставится знак *. Однако в данном контексте он просто сообщает, что данная переменная - это указатель, и знак * не имеет отношения к извлечению значения.

#include <stdio.h>
 
main () {
	// объявление массива и его инициализация
	int arr[10] = {101, 102, 103, 104, 105, 106, 107, 108, 109, 110};
	int *p, *q; // указатели на тип int
	int i;
 
	printf("Массив: ");

Язык Си. Функция, разворачивающая строку наподобие a-z (стр. 77)

Ответ к упражнению 3.3. Упрощенная версия.

Программа разворачивает строку наподобие a-z в строку abc...xyz. Если первая строка некорректно записана (например, z-a или oiy), то вторая строка содержит только символ конца строки.

#include <stdio.h>
 
int expand (char s[], char s1[]);
 
main () {
	int i;
	char str[3], str1[50];
 
	i = 0;
	while (i < 3) {
		str[i] = getchar();
		i++;
	}
	str[i] = '\0';
 
	expand(str, str1);
 
	printf("%s\n", str1);
}
 
int expand (char s[], char s1[]) {
	int c1, c2, i;
 
	i = 0;
	if (s[1] == '-' && s[0] < s[2]) {
		c1 = s[0];
		c2 = s[2];
		while (c1 <= c2) {
			s1[i] = c1;
			++i;
			++c1; 
		}
	}
	s1[i] = '\0';
}

Язык Си. Замена управляющих символов обычными и наоборот (стр. 73)

Ответ к упражнению 3.2.

Замена управляющих последовательностей обычными символами

#include <stdio.h>
#define MAX 1000
 
void escape (char s[], char s1[]);
 
main () {
	char str[MAX], str1[MAX];
	int i, c;
 
	for (i = 0; (c = getchar()) != EOF; ++i)
		str[i] = c;
 
	escape (str1, str);
	printf("%s\n", str1);	
}
 
void escape (char to[], char from[]) {
	int i, k;
 
	i = k = 0;
	while (from[i] != '\0') {
		switch (from[i]) {
		case '\n':
			to[k++] = '\\';
			to[k++] = 'n';
			break;
		case '\t':
			to[k++] = '\\';
			to[k++] = 't';
			break;
		default:
			to[k++] = from[i];
			break;
		}
		++i;
	}
	to[k] = '\0';
}

Примечание. Используется постфиксная форма инкремента (k++). В этом случае k сначала используется и только потом увеличивается на единицу.
При выводе измененной строки появляются странные "артефакты" в конце.

Замена пар символов "\n" и "\t" управляющими последовательностями

#include <stdio.h>

Язык Си. Двоичный поиск (стр. 71-72)

В книге описана функции поиска элемента в упорядоченном массиве с помощью алгоритма двоичного поиска (дихотомии).

Пример рабочей программы с использованием этой функции:

#include <stdio.h>
 
int binsearch (int x, int v[], int n);
 
main () {
	int n = 10;
	int i, k = 2;
	int arr[n];
 
	for (i = 0; i < n; i++) {
		arr[i] = k;
		k += 3;
		printf ("%d ", arr[i]);
	}
 
	printf ("\n");
	scanf ("%i", &k);
 
	i = binsearch (k, arr, n);
	printf("%d\n", i);
}
 
int binsearch (int x, int v[], int n) {
	int low, high, mid;
 
	low = 0;
	high = n - 1;
	while (low <= high) {
		mid = (low + high) / 2;
		if (x < v[mid])
			high = mid - 1;
		else 
			if (x > v[mid])
				low = mid + 1;
			else
				return mid;
	}
	return -1;
}

RSS-материал