Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Tests
  Test Red Hat
  Test
  Test Perl
  Test King
  Test OS
  Test 486
=>  Test ANSI C
  Test LPG
  Test Kernel
  Test Python
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...3163 
 Trees...1531 
 William Gropp...1488 
 Ethreal 3...1446 
 C++ Patterns 3...1435 
 Ethreal 4...1427 
 Максвелл 3...1419 
 Rodriguez 6...1417 
 Максвелл 5...1413 
 Go Web ...1409 
 Httpd-> История Ap...1407 
 Ext4 FS...1407 
 Kamran Husain...1404 
 Стивенс 9...1401 
 Robert Love 5...1398 
 K&R 1...1397 
 Erlang...1391 
 OS ->Intel Manual 1...1390 
 Perl OOP...1388 
 Rubni-Corbet -> Глав...1385 
 
  01.01.2024 : 3621733 посещений 

 

 

Язык программирования Си ,(K&R)

1. Перечислите базовые типы С ? 2. Перечислите базовые операторы ? 3. Как происходит Неявные арифметические преобразования типов ? 4. В чем отличие префиксного инкремента от постфиксного ? 5. Что делает функция strcat(s,t) ? 6. Сколько в си побитовых операций ? 7. Какие вы знаете основные типы переменных с точки зрения видимости ? 8. В чем особенность static в применении к переменным и функциям? 9. Макроподстановки define ? 10. Перечислите операторы условной компиляции препроцессора ? 11. Что такое указатель ? 12. Напишите реализацию strcpy с помощью указателей ? 13. Напишите реализацию strcmp с помощью указателей ? 14. Что такое структура ? 15. Какие операции возможны над структурами ? 16. Как проинициализировать массив структур ? 17. Что такое дескриптор файлов ? 18. Как работает ввод-вывод для обычных регулярных файлов ? 19. Как измерить время выполнения функции ?

Упражнения

20. Напишите функцию reverse(s), размещающую символы в строке s в обратном порядке. ? 21. Напишите программу, убирающую все комментарии из любой Си- программы ? 22. Напишите программу, убирающую повторы символов в строке ? 24. Бинарный поиск числа в массиве чисел ? 25. Напишите функцию itob(n,s,b), которая переводит целое n в строку s, представляющую число по основанию b ? 30. С помощью указателей написать реализацию strcat , strcpy ? 32. Программа сравнивает 2 файла и выводит строки , которые отличаются ? 33. Реализовать утилиту cat (stdio) ? 34. Написать программу , сохраняющую связный список на диске ?

UNIX - универсальная среда программирования , Керниган & Пайк

Файловая система

1. Какая команда показывает содержимое файла? 2. Как узнать тип файла ? 3. Как узнать имя текущего каталога ? 4. Что делает команда du -a ? 5. Что делает команда du -a | grep myfile ? 6. Что делает команда cd без параметров ? 7. Что делает команда su ? 8. Команда ls -l myfile выводит атрибуты файла в виде -rw-r--r-- что они означают ? 9. Какая команда меняет права доступа к файлу ? 10. Что делает команда chmod 666 myfile ? 11. Что делают команды chmod +x myfile , chmod -w myfile , chmod -w . ? 12. Что делает команда ls -i ? 13. Что делает команда ln old_file new_file ? 13-1. Что делает команда ln -li ? 14. Какая команда копирует файл ? 15. Какая команда переносит файлы ? 16. Как скопировать или переместить сразу несколько файлов ? 17. Какая команда дает инфу о свободном дисковом пространстве ? 18. Что делает команда tty ? 19. Что делает команда cat file > /dev/null ? 20. Что делает командаа tee ? 21. Что означает знак амперсанда & между двумя командами ? 22. Что значит метасимвол звездочка * ? 23. Как специальный мета-символ использовать в качестве обычного ? 24. Что делает команда ls x*y ? 25. Что делает команда >xsfsdfy ? 26. Что делает команда wc ? 27. Как распечатать глобальный список видимых каталогов поиска ? 28. Как работает команда grep ? 29. Как вывести список всех переменных ? 30. Как создать переменную ? 31. Какая команда показывает разницу между файлами ? 32. Как в шелл переключается ввод-вывод ? 33. Как применить оператор цикла ?

Фильтры

34. Какие утилиты относятся к фильтрам ? 35. Какие флаги есть у команды grep ? 36. Какие мета-символы используются в команде grep ? 37. Какие классы символов использует grep ? 38. чем различаются grep , egrep , fgrep ? 39. Какие флаги есть у команды sort ? 40. Какие есть флаги у команды uniq ? 41. Какая утилита сравнивает файлы ? 42. Какая команда производит транс-литерацию файла ? 43. Как работает потоковый редактор sed ? 44. Каков принцип работы команды awk ? 45. Какие есть встроенные переменные у интерпретатора шелл ? 46. Для чего нужна команда trap ? 47. Как уничтожить процесс ? 48. Что делает команда shift ?

Программирование в си

49. Чем отличаются команды open и fopen ? 50. Написать аналог соманды cp ? 51. Какая структура описывает дескриптор файла ? 52. Написать функцию которая будет копировать файл в каталог с проверкой ? 53. Как вызвать внешнюю программу ? 54. Написать программу , которая периодически будет проверять файл ? 55. Написать функцию-аналог для system ? 56. Как работает системный вызов сигнал ? 57. Написать программу , которая создаст фоновый процесс и прибьет его по тайм-ауту ?

Вопросы на интервью

1. Что распечатает программа ?

 1. void main()
 {
     int  const * p=5;
     printf("%d",++(*p));
 }
 

1. Что распечатает программа ?

 2. main()
     {
     static int var = 5;
     printf("%d ",var--);
     if(var)
         main();
     }
 

1. Что распечатает программа ?

 3.     int c[ ]={2,3,4,5,6};
      int j,*p=c,*q=c;
      for(j=0;j<5;j++) 
 	{
         printf(" %d ",*c);
            ++q;      
 	}
 	for(j=0;j<5;j++)
 	{
 		printf(" %d ",*p);
 		++p;      
 	}
 

1. Что распечатает программа ?

 4.    extern int i;
     i=20;
 	printf("%d",i);
 

1. Что распечатает программа ?

 
 5.   int i=-1,j=-1,k=0,l=2,m;
     m=i++&&j++&&k++||l++;
     printf("%d %d %d %d %d",i,j,k,l,m);
 }
 

1. Что распечатает программа ?

 6.  char *p;
   printf("%d %d ",sizeof(*p),sizeof(p));
 

1. Что распечатает программа ?

 7.
  char *p;
  p="Hello";
  printf("%c\n",*&*p);
 

1. Что распечатает программа ?

 8.  char *str1="abcd";
     char str2[]="abcd";
     printf("%d %d %d",sizeof(str1),sizeof(str2),sizeof("abcd"));
 

1. Что распечатает программа ?

 9.    char not;
     not=!2;
     printf("%d",not);
 

1. Что распечатает программа ?

 10.
 char s[]={'a','\0'};
 char *p,*p2,*p3;
 p=&s[0];
 p2=&s[1];
 printf("%d\n",++*p);
 printf("%d\n",*p++);
 printf("%d\n",++*p2);
 printf("%d\n",*p2++);
 

1. Что распечатает программа ?

 11. 
     int i=5;
     printf("%d",++i + i++);
 

1. Что распечатает программа ?

 12.
   struct xx
    {
       int x=3;
       char name[]="hello";
    };
 

1. Что распечатает программа ?

 13.
   int a[ ] = {10,20,30,40,50};
   for(j=0; j<5; j++)
     {
 		printf("%d\n" ,*a);
 		a++;
     }
 

1. Что распечатает программа ?

 14 .
  static int  a[] = {0,1,2,3,4};
  int  *p[] = {a,a+1,a+2,a+3,a+4};
  int  **ptr =  p;
  ptr++;
  printf("\n %d  %d  %d", ptr-p, *ptr-a, **ptr);
 

1. Что распечатает программа ?

 15.
  void *vp;
  char ch = 'g', *cp = "goofy";
  int j = 20;
  vp = &ch;
  printf("%c", *(char *)vp);
  vp = &j;
  printf("%d",*(int *)vp);
  vp = cp;
  printf("%s",(char *)vp + 3);
 

1. Что распечатает программа ?

 16
  int  i, n;
  char *x = "girl";
  n = strlen(x);
  for(i=0; i< n; ++i)
  {
 	printf("%s\n",x);
 	x++;
  }
 
2. Как сконвертировать число в строку ?

3. Чем отличаются strcpy и strncpy ?

4. Как работает assert ?

5. Наиболее часто используемые функции в си ?

6. Как проверить на равенство 2 строки ?

7. что будет распечатано ?

     if(0) 
     { 
      printf("Hello"); 
     } 
     else 
     { 
         printf(" World"); 
     } 
 

8. Что такое longjmp() and setjmp() ?

9. В чем разница между *p++ и (*p)++ ?

10. В чем разница между NULL-указателем и непроинициализированным указателем ?

11. Нужно ли в си при использовании malloc ставить перед ней приведение типа ?

12. В чем разница между const char *p, char * const p и const char * const p? ?

13. Почему нельзя применять арифметические операции к указателю типа void ?

14. Какая разница между массивом указателей и указателем на массив ?

15. Что делают функции brk() и sbrk() ?

16. Что такое reference counter ?

17. Какие операции можно делать над указателями ?

18. Стандартные ошибки при работе с указателями ?

19. Поддерживается ли в си перегрузка функций ?

20. Для чего нужны inline-функции ?

21. Как определить функцию с переменным числом параметров ?

22. Какой тип параметров по умолчанию в Си - по ссылке или по значению ?

23. Как с помощью битоввого сдвига разделить число на 2 ?

24. В чем разница статической и динамической линковки ?

25. Какова сравнительная стоимость по времени основных алгоритмов поиска/сортировки ?

26. Чем стек отличается от кучи ?

27. В чем разница между ссылкой и указателем ?

28. В чем особенность static ?

29. Имеется 4-мерный массив . Как с помощью указателя обратиться к произвольному элементу этого массива ?

30. Как сделать своп без 3-й переменной ?

31. Для чего нужны модификаторы volatile и register ?

32. Как сконвертировать строку в число ?

33. Функция realloc ?

34. Какой уровень вложенности у указателя по стандарту ?

35. Какие существуют предопределенные макрос - predefined macros ?

36. Что такое pragma ?

37. Для чего нужны указатели на функции ?

38. Какие есть 2 основных метода инициализации указателей ?

39. Как с помощью printf распечатать первые n символов строки ?

40. Что будет напечатано ?

 int i;
 for (i = 0; i < 5; ++i)
      printf("%d\n",i);
 

41. Что будет напечатано ?

 printf("1") && printf(" 2") && printf(" 3") || printf(" 4");
 

42. Что будет напечатано ?

 int x = (4, 8 , 10, 12,printf("543210"));
 

43. Что будет напечатано ?

 	printf("%s  %s  %d \n", __DATE__,__FILE__ ,__LINE__);
 

44. Что будет напечатано ?

 void print(int x = 1, int y = 2, int z = 3)
 {
      cout << x  << y <<  z  ;
 }
 
 int main()
 {
      print(), print(4), print(5, 6), print(7, 8, 9);
 	 return 0 ;	
 }
 
 

45. Что напечатает программа ?

 #define d 10+10 
 printf("%d\n",d*d);  
 

46. Написать собственную версию функции strstr ?

 
 

47. Как проверить , установлен ли в числе x бит под номером n ?

 
 

48. Как узнать , установлен ли 5-й бит в числе ?

 
 

49. Дано число . Распечатать его в обратном порядке цифр ?

 
 

50. Что будет напечатано ?

  int x = 1; 
  printf("%d\n", x++ + x++ ) ; 
  printf("%d\n", ++x + ++x) ;  
  printf("%d\n", ++x + x++ ) ; 
  printf("%d\n", x++ + ++x ) ; 
  printf("%d\n", x ) ;
 
 

51. Что будет напечатано ?

 int array[5]={10,20,30,40,50};     
     int *data_ptr;   
     int value;       
     data_ptr = &array[0];
     value = *data_ptr++;   
 	printf("%d\n",value);
     value = *++data_ptr;   
 	printf("%d\n",value);
     value = ++*data_ptr; 
 	printf("%d\n",value);
 
 

52. Чем отличаются : ?

 int *a[10] 
 и
 int (*a)[10]; 
 

53. Сначала установить в числе только 3-й бит в 0 , а потом в единицу ?

 
 

54. Что будет напечатано ?

   unsigned int a = 6;
   int b = -20;
       (a+b > 10) ? printf("> 6\n") : printf(" < = 6\n");
 
 

55. Что будет напечатано ?

 int a = 5, b = 7, c;
 c = a +++ b;
 printf("%d\n",c);
 
 

Ответы

1. char , int , float , double.
В комбинации с ними могут быть использованы квалификаторы short и long.
Квалификаторы signed (со знаком) или unsigned (без знака) можно применять к типу char и любому целочисленному типу.

2. 1. Арифметические Бинарные операторы - плюс , минус , умножить , разделить , а также оператор деления по модулю %

 2. Операторы отношения :
 >
 >=
 <
 <=
 
3. логические операторы && и ||
4. Один из унарных операторов : * & - ! ~ +

3. Если какой-либо из операндов принадлежит типу long double, то и другой приводится к long double.
В противном случае, если какой-либо из операндов принадлежит типу double, то и другой приводится к double.
В противном случае, если какой-либо из операндов принадлежит типу float, то и другой приводится к float.
В противном случае операнды типов char и short приводятся к int.
И наконец, если один из операндов типа long, то и другой приводится к long.

4. Выражения ++var и var++ идентичны с той лишь разницей , что в первом случае значение var будет увеличено до использования , а во втором - после .

5. strcat char *strcat(char *dest, const char *src);
добавляет строку str к строке dest, перезаписывая символ `\0' в конце dest, и добавляя завершающий символ `\0'. Возвращает dest .

6.

 В Си имеются шесть операторов для манипулирования с битами. 
 Их можно применять только к целочисленным операндам, 
 т. е. к операндам типов char, short, int и long, знаковым и беззнаковым.
 & - побитовое И
 | - побитовое ИЛИ
 ^ - побитовое исключающее ИЛИ. 
 << - сдвиг влево. 
 >> - сдвиг вправо.
 ~ - побитовое отрицание (унарный).
 

7. 1. автоматические , т.е. расположенные внутри функций
2. внешние , определенные за пределами функций , видимые в текущем файле
3. внешние с приставкой extern, видимые во всех файлах проекта

 Важно отличать объявление внешней переменной от ее определения. 
 Объявление объявляет свойства переменной (прежде всего ее тип), а определение, кроме того, 
 приводит к выделению для нее памяти. Если строки
 	int sp;
 	double val[MAXVAL];
 расположены вне всех функций, то они определяют внешние переменные sp и val, 
 т. e. отводят для них память, и, кроме того, служат объявлениями для остальной части исходного файла. 
 А вот строки
 	extern int sp;
 	extern double val[];
 объявляют для оставшейся части файла, что sp - переменная типа int, 
 а val - массив типа double (размер которого определен где-то в другом месте); 
 при этом ни переменная, ни массив не создаются, и память им не отводится.
 

8. Функции и внешние переменные с ключевым словом static становятся видимыми только в пределах текущего файла .

9.

 Определение макроподстановки имеет вид:
 	#define имя замещающий-текст
 Макроподстановка используется для простейшей замены: во всех местах, где встречается лексема имя, 
 вместо нее будет помещен замещающий-текст. 
 Имена в #define задаются по тем же правилам, что и имена обычных переменных. 
 Замещающий текст может быть произвольным. 
 Обычно замещающий текст завершает строку, в которой расположено слово #define, 
 но в длинных определениях его можно продолжить на следующих строках, 
 поставив в конце каждой продолжаемой строки обратную наклонную черту \. 
 Область видимости имени, определенного в #define, простирается от данного определения до конца файла. 
 В определении макроподстановки могут фигурировать более ранние #define-определения. 
 
 

10. #if , #endif, #elif, #else , #ifdef , #ifndef
Инструкции #ifdef и #ifndef специально предназначены для проверки того, определено или нет заданное в них имя

 
 Например, чтобы застраховаться от повторного включения заголовочного файла hdr.h, 
 его можно оформить следующим образом:
 	#if !defined(HDR)
 	#define HDR
 		/* здесь содержимое hdr.h */
 	#endif
 
 С помощью #ifdef и #ifndef это же можно записать так :
 	#ifndef HDR
 	#define HDR
 	
 	/* здесь содержимое hdr.h */
 	
 	#endif
 
 

11. Указатель - это переменная, содержащая адрес переменной.

12.

 /* strcpy: копирует t в s; */
 void strcpy(char *s, char *t)
 {
     while ((*s++ = *t++) != '\0')  ;
 }
 

13. Она сравнивает символы строк s и t и возвращает отрицательное, нулевое или положительное значение, если строка s соответственно лексикографически меньше, равна или больше, чем строка t.

 /* strcmp: выдает < 0 при s < t, 0 при s == t, > 0 при s > t */
 int strcmp(char *s, char *t)
 {
     for ( ; *s == *t; s++, t++)
         if (*s == '\0')
             return 0;
     return *s - *t;
 }
 
 

14. Структура - это одна или несколько переменных (возможно, различных типов), которые для удобства работы с ними сгруппированы под одним именем. Следующее обьявление не выделяет память под структуру :

 	struct point {
 		int x;
 		int y;
 	};
 
Для выделения нужно : struct point pt;
Далее - обращение : pt.x = 0 ;

15. копирование, присваивание, взятие адреса с помощью & и осуществление доступа к ее элементам .
Например , копирование :

 	struct point origin, *pp;
 	pp = &origin;
 

16.

 	struct key {
 		char *word;
 		int count;
 	} keytab[] = {
 		"auto", 0,
 		"break", 0,
 		"case", 0,
 		"char", 0,
 		"const", 0,
 		"continue", 0,
 		"default", 0,
 		/*...*/
 		"unsigned", 0,
 		"void", 0,
 		"volatile", 0,
 		"while", 0
 	};
 

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

18. В отличие от стандартных файлов ввода, вывода и ошибок, которые открыты по умолчанию, остальные файлы нужно открывать явно. Для этого есть два системных вызова: open и creat. Ввод-вывод основан на системных вызовах read и write. Для обеих первым аргументом является дескриптор файла. Во втором аргументе указывается массив символов вашей программы, куда посылаются или откуда берутся данные. Третий аргумент - это количество пересылаемых байтов.

 	int n_read = read(int fd, char *buf, int n);
 	int n_written = write(int fd, char *buf, int n);
 
Обе функции возвращают число переданных байтов. Если это число не совпадает с требуемым, следует считать, что запись не произошла. Функции для работы с обычными файлами : open , close , create , unlink(удаление) , lseek(перемещение по файлу)

19.

 	1. gettimeofday до и после вызова и считать время (до микросекунд) 
 	2. скомпилировать с ключом -pg , затем запустить команду gprof - но говорят , при многопоточночти глючит 
 	3. Использовать конструкцию вида:
 			struct timespec now;
 			clock_gettime(CLOCK_REALTIME, &now); 
 	4. valgrind profiler
 	
 	5. 
 #ifndef __TSC_TSCMEASUREMENT_H__
 #define __TSC_TSCMEASUREMENT_H__
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 typedef struct {
 	long unsigned	tsc_low,
 					tsc_high,
 					tsc_low1,
 					tsc_high1;
 } TscMeasurement;
 
 #define rdtsc(low,high) \
      __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
 
 inline void tsc_start_measurement (TscMeasurement *tm) {
 	rdtsc (tm->tsc_low, tm->tsc_high);
 }
 
 inline void tsc_stop_measurement (TscMeasurement *tm) {
 	rdtsc (tm->tsc_low1, tm->tsc_high1);
 }
 
 inline long long unsigned tsc_get_ticks (const TscMeasurement *tm)
 {
 	long long unsigned tsc, tsc1;
 	tsc = (long long unsigned) tm->tsc_high << 32 |
 		((long long unsigned) tm->tsc_low & 0xffffffff);
 	tsc1 = (long long unsigned) tm->tsc_high1 << 32 |
 		((long long unsigned) tm->tsc_low1 & 0xffffffff);
 	return tsc1 - tsc;
 }
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif /*__TSC_TSCMEASUREMENT_H__*/
 
 и в файле использовать :
 
 	TscMeasurement tm;
 	tsc_start_measurement (&tm);
 	f ();
 	tsc_stop_measurement (&tm);
 	printf ("CPU ticks: %ull\n", tsc_get_ticks (&tm));
 
 

20.

 
 char* reverse ( char* str )
 {
 	int count = strlen(str);
 	char* temp = (char *) malloc(strlen(str)*sizeof(char));
 	temp +=count;	
 
 	while ( *str != '\0') 
 	{
 		*temp = *str;
 		str++;
 		if(*str != '\0')
 			temp--;
 	}
 
 	return  temp ;
 }
 
 ...
 
 char array [] = {"1234567890"};
 char * str  = reverse(array);
 
 
 

21.

 /*Напишите программу, убирающую все комментарии из любой Си- программы*/
 
 #include < stdio.h>
 
 #define MAXLINE 1000 /* max input line size */
 char line[MAXLINE]; /*current input line*/
 
 int getline(void);  /* taken from the KnR book. */
 
 
 int
 main()
 {
   int in_comment,len;
   int in_quote;
   int t;
   
   in_comment = in_quote = t = 0;
   while ((len = getline()) > 0 )
     {
       t=0;
       while(t < len)
         {
 	  if( line[t] == '"')
 		in_quote = 1;
 
 	  if( ! in_quote )
 	  {
           	if( line[t] == '/' && line[t+1] == '*')
             	{
               		t=t+2;
               		in_comment = 1;
             	}
           	if( line[t] == '*' && line[t+1] == '/')
             	{
               		t=t+2;
               		in_comment = 0;
             	}
           	if(in_comment == 1)
            	 {
               		t++;
             	}
           	else
             	{
               		printf ("%c", line[t]);
               		t++;
             	}
 	  } 
 	  else
 	  {
               printf ("%c", line[t]);
               t++;
 	  }
         }
     }
   return 0;
 }
 
 
 /* getline: specialized version */
 int getline(void)
 {
   int c, i;
   extern char line[];
   
   for ( i=0;i< MAXLINE-1 && ( c=getchar()) != EOF && c != '\n'; ++i)
     line[i] = c;
   if(c == '\n') 
     {
       line[i] = c;
       ++i;
     }
   line[i] = '\0';
   return i;
 
 }
 
 
 
 
22.
 char * del_double(char * str)
 {
 	char * result = malloc(strlen(str)*sizeof(char)+1);
 	result=str;
 	int count=1;
 	while(*str++)
 	{
 		if(*str != *(str-1) )
 			result[count++]=*str;
 	}
 	result[count]='\0';
 	return result;
 }
 
 
 
 int main()
 {
 	char str[]={"aaa bbbbb cc 1233  rr t"};
 	printf("Start:  %s\n",str);
 	char *r = del_double(str);
 	printf("Finish: %s\n",r);
 }
 
 
24.
 /** Бинарный поиск числа в массиве чисел*/
 
 #include 
 #include 
 
 int binsearch(int x, int v[], int n);     /*  Original K&R function  */
 int binsearch2(int x, int v[], int n);    /*  Our new function       */
 
 #define MAX_ELEMENT 20000
 
 
 /*  Outputs approximation of processor time required
     for our two binary search functions. We search for
     the element -1, to time the functions' worst case
     performance (i.e. element not found in test data)   */
 
 int main(void) {
     int testdata[MAX_ELEMENT];
     int index;                  /*  Index of found element in test data  */
     int n = 123;                 /*  Element to search for  */
     int i;
     clock_t time_taken;
 
     /*  Initialize test data  */
     
     for ( i = 0; i < MAX_ELEMENT; ++i )
         testdata[i] = i;
     
     
     /*  Output approximation of time taken for
         100,000 iterations of binsearch()       */
     
     for ( i = 0, time_taken = clock(); i < 100000; ++i ) {
         index = binsearch(n, testdata, MAX_ELEMENT);
     }
     time_taken = clock() - time_taken;
     
     if ( index < 0 )
         printf("Element %d not found.\n", n);
     else
         printf("Element %d found at index %d.\n", n, index);
     
     printf("binsearch() took %lu clocks (%lu seconds)\n",
            (unsigned long) time_taken,
            (unsigned long) time_taken / CLOCKS_PER_SEC);
     
     
     /*  Output approximation of time taken for
         100,000 iterations of binsearch2()        */
     
     for ( i = 0, time_taken = clock(); i < 100000; ++i ) {
         index = binsearch2(n, testdata, MAX_ELEMENT);
     }
     time_taken = clock() - time_taken;
     
     if ( index < 0 )
         printf("Element %d not found.\n", n);
     else
         printf("Element %d found at index %d.\n", n, index);
     
     printf("binsearch2() took %lu clocks (%lu seconds)\n",
            (unsigned long) time_taken,
            (unsigned long) time_taken / CLOCKS_PER_SEC);
     
     return 0;
 }
 
 
 /*  Performs a binary search for element x
         in array v[], which has n elements      */
 
 int binsearch(int x, int v[], int n) {
     int low, mid, high;
     
     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;
 }
 
 
 /*  Implementation of binsearch() using
     only one test inside the loop        */
 
 int binsearch2(int x, int v[], int n) {
     int low, high, mid;
     
     low = 0;
     high = n - 1;
     mid = (low+high) / 2;
     while ( low <= high && x != v[mid] ) {
         if ( x < v[mid] )
             high = mid - 1;
         else
             low = mid + 1;
         mid = (low+high) / 2;
     }
     if ( x == v[mid] )
         return mid;
     else
         return -1;
 	}
 	
 	
 

25.

 /** 
 Напишите функцию itob(n,s,b), которая переводит целое n в строку s, 
 представляющую число по основанию b
 */
 
     
 void itob(int n, char s[], int b);
 void reverse(char s[]);
 
 int main(void) {
     char buffer[10];
     int i;
     
     for ( i = 2; i <= 20; ++i ) {
         itob(255, buffer, i);
         printf("Decimal 255 in base %-2d : %s\n", i, buffer);
     }
     return 0;
 }
 
 
 /*  Stores a string representation of integer n
     in s[], using a numerical base of b. Will handle
     up to base-36 before we run out of digits to use.  */
 
 void itob(int n, char s[], int b) {
     static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     int i, sign;
     
     if ( b < 2 || b > 36 ) {
         fprintf(stderr, "EX3_5: Cannot support base %d\n", b);
         exit(EXIT_FAILURE);
     }
     
     if ((sign = n) < 0)
         n = -n;
     i = 0;
     do {
         s[i++] = digits[n % b];
     } while ((n /= b) > 0);
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
 }
 
 
 /*  Reverses string s[] in place  */
 
 void reverse(char s[]) {
     int c, i, j;
     for ( i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }
 
 
 
 

30.

 void strcpy(char *s, char *t)
 {
   while(*s++ = *t++);
 }
 
 void strcat(char *s, char *t)
 {
   while(*s)
   {
     ++s;
   }
   strcpy(s, t);
 }
 
 int main(void)
 {
   char testbuff[128];
 
   char *test[] =
   {
     "",
     "1",
     "12",
     "123",
     "1234"
   };
 
   size_t numtests = sizeof test / sizeof test[0];
   size_t thistest;
   size_t inner;
 
   for(thistest = 0; thistest < numtests; thistest++)
   {
     for(inner = 0; inner < numtests; inner++)
     {
       strcpy(testbuff, test[thistest]);
       strcat(testbuff, test[inner]);
 
       printf("[%s] + [%s] = [%s]\n", test[thistest], test[inner], testbuff);
     }
   }
 
   return 0;
 }
 
 

32.

 void diff_line( char *lineone, char *linetwo, int linenumber )
 {
   if(strcmp (lineone, linetwo) < 0 || strcmp (lineone, linetwo) > 0)
     printf( "%d<%s\n%d>%s\n", linenumber, lineone, linenumber, linetwo);
 }
 
 int main(int argc, char *argv[] )
 {
   FILE *fp1, *fp2;
   char fp1_line[MAXLINE], fp2_line[MAXLINE];
   int i;
 
   if ( argc != 3 )
     {
       printf("differ fileone filetwo\n");
       exit(0);
     }
 
   fp1 = fopen( argv[1], "r" );
   if ( ! fp1 )
     {
       printf("Error opening file %s\n", argv[1]);
     }
 
   fp2 = fopen( argv[2], "r" );
   if ( ! fp2 )
     {
       printf("Error opening file %s\n", argv[2]);
     }
   i = 0;
   while ( (fgets(fp1_line, MAXLINE, fp1) != NULL) 
 	  && (fgets(fp2_line, MAXLINE, fp2) != NULL))
   {
     diff_line( fp1_line, fp2_line, i );
     i++;
   }
 
   return 0;
 }
 
 
 

33.

 	 FILE * fp ;
   	 char * fname;
 	 int c;
 
     if (argc == 1) 
         exit(0);
     else
 		fname=argv[1];
 
 	fp = fopen(fname, "r");
 		while ((c = getc(fp)) != EOF)
 			putc(c, stdout);
 		fclose(fp);
 
 	 char fp1_line[255];
 	 fp = fopen( fname, "r" );
 	 while (fgets(fp1_line, 255, fp) != NULL) 
 			puts(fp1_line);
 	 fclose(fp);
 
 
 А этот кусок не работает :
 int main(int argc, char *argv[])
 {
   int fd1;
   void filecopy(int f, int t);
   
   if(argc == 1)
     filecopy(0, 1);
 
   else {
     while(--argc > 0)
       if(( fd1 = open(*++argv, O_RDONLY, 0)) == -1) {
 	printf("unix cat: can't open %s\n", *argv);
 	return 1;
       }
       else {
 	filecopy(fd1, 1);
 	close(fd1);
       }
   }
   
   return 0;
   
 }
 
 void filecopy(int from, int to)
 {
   int n;
   char buf[BUFSIZE];
 
   while((n=read(from, buf, BUFSIZE)) > 0 )
     write(to, buf, n);
 }
 
 	
 

34.

 #include < stdio.h>
 #include < stdlib.h>
  
 typedef struct contact 
 {
 	int number; 
 	char name[20];
 	struct contact *next;
 } Contact;
  
 Contact *firstc,*currentc,*newc; 
  
 int cnum = 0; 
 
 void readfile()
 {
 	char *filename = "contact.dat";
 	firstc = NULL;
 	FILE *datafile = fopen(filename,"r");
 	if(datafile)
 	{
 		firstc = (struct contact *)malloc(sizeof(struct contact));
 		currentc = firstc; 
 		while(1) 
 		{
 			newc = (struct contact *)malloc(sizeof(struct contact));
 			fread(currentc,sizeof(struct contact),1,datafile);
 			if(currentc->next == NULL)	break;
 			currentc->next = newc; 
 			currentc = newc;
 		}
 		fclose(datafile); 
 		cnum = currentc->number;
 	}
 }
 
 void savefile()
 {
 	char *filename = "contact.dat";
 	FILE * datafile = fopen(filename,"w"); 
 	if(datafile == NULL) return;
 	if(firstc==NULL) firstc = currentc = newc;
 	else currentc = firstc; 
 	while(currentc != NULL)
 	{
 		fwrite(currentc,sizeof(struct contact),1,datafile);
 		currentc = currentc->next;
 	}
 	fclose(datafile); 
 }
 
 void addNewcontact() 
 {
 	newc = (struct contact *)malloc(sizeof(struct contact));
 	if(firstc==NULL)
 	firstc = currentc = newc;
 	else
 	{
 		currentc = firstc; 
 		while(currentc->next != NULL)
 			currentc = currentc->next;
 		currentc->next = newc; 
 		currentc = newc; 
 	}
 	cnum++;
 	currentc->number = cnum;
 	sprintf(currentc->name,"%d",cnum*123);
 	currentc->next = NULL;
 }
  
 void listAll(void) /* list all contacts function*/
 {
 	if(firstc==NULL)return;
 	else
 	{
 		currentc=firstc;
 		do
 		{
 			printf("%d  %s\n",	currentc->number,currentc->name);
 		}
 		while((currentc=currentc->next) != NULL);
 	}
 }
  
 int main()
 {
 	readfile();
 	addNewcontact();
 	savefile();
 	listAll();
 }
 
 
 

14.

 

14.

 

14.

 

1. cat myfile

 
 

2. file myfile

 

3. pwd

 

4. распечатывает список файлов в текущем каталоге , слева показывается размер файла в блоках

 

5. ищет в текущем каталоге myfile

 

6. переходит в домашний каталог

 

7. дает возможность стать рутом

 

8.

 -rw-r--r-- 
 Первый дефис - показывает , что это обычный файл (для каталога это была бы буква d)
 Следующие 3 символа означают права на чтение , запись и выполнение 
 rw- означает , что можно читать , писать , но не выполнять - для выполнения нужен дефис x
 Следующие 3 символа r-- означают права пользователей из группы , которой принадлежит данный пользователь 
 Последние 3 символа r-- означают права всех остальных пользователей
 

9. chmod

 

10.

 Восьмиричное значение складывается из прав доступа :
 4 - чтение
 2 - запись
 1 - выполнение
 
 Т.е. 6=4+2 , т.е. здесь даются права на чтение и на запись
 Эти права одинаковы для пользователя , его группы пользователей , и всех остальных пользователей
 

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

 

12. выводит список файлов вместе с номером ноды файла в десятичной форме

 

13. создает симлинк

 

13-1. дополнительно в 1-м столбце показывает номер файловой ноды , в 3-м число связей , для симлинка видно , что номер ноды совпадает

 1107596 -r-xr-xr-x 2 root root 8 2008-08-10 07:20 1.txt
 1107596 -r-xr-xr-x 2 root root 8 2008-08-10 07:20 2
 
 

14. cp old_file new_file

 

15. mv old new

 

16. cp (или mv) f1 f2 f3 ... dest_dir

 

17. df

 

18. команда говорит , какой терминал вы используете

 tty
 /dev/pts/3
 
 

19. перенаправляет выходной поток и ничего не выводит

 

20. пишет выходной поток в файл

 например
 (date; who) | tee 123
 результат работы первых двух команд будет записан в файл 123
 

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

 

22. что нужно работать со всеми файлами в каталоге

 печать имен всех файлов текущего каталога
 	echo * 
 
 печать содержимого всех файлов текущего каталога
 	cat * 
 
 
 

23. поставить его в одинарные кавычки либо поставить перед ним обратный слеш

 echo '*'
 
вместо одинарных можно использовать двойные кавычки , но керниган не рекомендует это делать

24. распечатывает все файлы , которые начинаются с x и заканчиваются y

 

25. создает файл

 

26. подсчитывает , в зависимости от аргумента , число строк , слов , байт в файлк

 

27. echo $PATH

 

28. первый аргумент у грепа - поисковая строка , второй - файл . Аргумент -y указывает , что регистр строки неважен

 рассмотрим пример
 	grep str file
 будут выведены все строки файла file , в которых будет найдена подстрока str
 

29. set

 

30.

 создание
 	var=123
 знак равно без пробелов
 затем обращение к переменной через доллар
 	echo $var
 переменная живет только в данном экземпляре интерпретатора
 для передачи переменной в порождаемый шелл (sh) нужно сделать экспорт
 	export var
 

31. diff f1 f2

 

32.

 вывод в файл
 	> file
 добавление в файл
 	>> file
 получение стандартного выходного потока
 	< file
 получение стандартного входного потока
 	<< file
 перенаправление ввода-вывода
 	command | command
 
 

33. оператор for имеет конструкцию

 	for var in list
 	do
 		команды
 	done
 получение списка файлов каталога	
 	for i in *
 	do
 		echo $i
 	done
 
 Также в шелл имеются еще 2 оператора цикла : while и until
 Код внутри этих циклов будет работать , пока условие не вернет ненулевой код для while 
 и нулевой для until
 	while
 	do
 		echo $i
 	done
 
 	until
 	do
 		echo $i
 	done
 
 

34.

 grep , tail - ищут в выходном потоке 
 wc - считает в нем
 sort - сортирует его
 tr - трансляция символов
 uniq - обнаружение повторяющихся строк
 sed - потоковый редактор
 
 

35.

 	-n   вывод номера строки
 	-v   меняет условие на противоположное
 	-y   игнорит регистр
 

36. метасимволы

 возведение в степень - ищутся только те строки , которые начинаются со строки
 	grep '^строка' file
 доллар - ищутся только те строки , которые находятся в конце строк
 	grep '$строка' file
 

37.

 любая строчная буква
 	[a-z]
 
 любой символ , окромя цифры
 	[^0-9]
 
 точка - это вообще любой символ
 
 повторитель - символ звездочка
 	x* - последовательность символов x произвольной длины
 
 любая строка букв
 	[a-zA-Z]
 
 комбинация точка-звездочка - все до конца строки
 	.*
 
 пример
 	.*x - все до последнего символа х
 
 пример - список всех файлов , доступных всем на чтение :
 	ls -l | grep '......r'
 
 

38. fgrep может искать несколько литеральных строк, egrep может использовать регулярные выражения со скобками , логическими условиями и т.д. fgrep и egrep имеет опцию -f . которая позволяет читать шаблоны регеспов из отдельного файла.

 пример
 	fgrep -f file1 file2
 
 в egrep символ | является операцией или	
 

39.

 игнорит регистр
 	-f  
 игнор всех символов , кроме букв , цифр и пробелов
 	-d
 сортировка по числовому значению
 	-n
 изменение направления сортировки на противоположный
 	-r
 имя файла для выходного потока
 	-o
 
 
 примеры :
 
 сортировка в алфавитном порядке
 	ls | sort -f
 сортировка в порядке возрастания размера файла
 ls -s | sort -n 
 

40.

 печать только повторяющихся строк файла
 	uniq -d file
 печать только уникальных строк файла
 	uniq -u file
 подсчет числа вхождений каждой строки
 	uniq -c
 
 
 

41. comm

 

42. tr , например для преобразования прописных букв в строчные

 

43. устройство команды

 	sed 'список команда ed' имена файлов
 
 читаются строки по одной из входных файлов
 команды из списка указываются по порядку к каждой строке
 результат пишется в stdout
 
 пример
 	who | sed 's .* / /'
 из вывода остается только имя пользователя и время входа в систему
 
 можно помещать команды sed в текстовой файл и затем извлекать их оттуда путем
 	sed -f file
 
 

44.

 	awk 'программа' имена файлов
 
 по порядку читаются файлы , берется строка , к которой применяется шаблон
 
 пример
 	awk '/регесп/' files
 
 каждая строка разбивается на отдельные слова , которые нумеруются ка 41 , $2 , $3 и т.д.
 
 пример
 	du -a | awk '{print $2}'
  будут распечатаны только имена файлов
 
 пример
 	sed 3q /etc/passwd | awk -F : '{print $1}'
 распечатываются перве 3 строки файла пароля , и в нем из первого поля выдирается только имя
 
 	date | awk '{print substr($4,1,5)}
 команда выдирает время из системной даты
 
 
 

45.

 число аргументов
 	$#
 все аргументы
 	$
 публичные каталоги
 	$PATH
 строка - приглашение
 	$PS1
 

46. для обработки сигналов

 	trap команды сигналы
 Сигналы тут -простые числа 1,2,3...
 
 

47. kill -9 номер_процесса

 

48. сдвигает список аргументов влево , при этом $2 становится $1 и т.д.

 

49. open возвращает дескриптор файла , fopen - указатель на файл

 

50. читаем на входе f1 и пишем его содержимое в выход f2

 	int f1, f2, n;
 	char buf[BUFSIZ];
 
 	f1 = open("file1", 0));
 	f2 = creat("file2", PERMS));
 
 	while ((n = read(f1, buf, BUFSIZ)) > 0)
 		write(f2, buf, n);
 
 

51.

 struct stat {
         unsigned long  st_dev;
         unsigned long  st_ino;
         unsigned short st_mode;
         unsigned short st_nlink;
         unsigned short st_uid;
         unsigned short st_gid;
         unsigned long  st_rdev;
         unsigned long  st_size;
         unsigned long  st_blksize;
         unsigned long  st_blocks;
         unsigned long  st_atime;
         unsigned long  st_atime_nsec;
         unsigned long  st_mtime;
         unsigned long  st_mtime_nsec;
         unsigned long  st_ctime;
         unsigned long  st_ctime_nsec;
         unsigned long  __unused4;
         unsigned long  __unused5;
 };
 
 st_dev - устройство , содержащее файл 
 st_ino - индекс
 st_mode - биты режима
 st_nlink - число связей файла
 st_uid - id-шник владельца
 
 дескриптор доступен 2-м системным вызовам - stat и fstat
 
 stat(name,&stbuf); name - имя файла
 fstat(fd,&stbuf);  fd - дескриптор
 
 
 
 
 

52. копируется файл в каталог лишь тогда , когда его там нет или его версия старее

 sv(file, dir)	// file - копируемый файл , dir - каталог назначения
 {
 	struct stat sti, sto;
 	int fin, fout, n;
 	char target[BUFSIZ], buf[BUFSIZ], *index();
 
 	sprintf(target, "%s/%s", dir, file);
 	if (stat(target, &sto) == -1)	/* нет такого файла в каталоге */
 		sto.st_mtime = 0;	
 	if (sti.st_mtime < sto.st_mtime)	/* файл уже есть в каталоге и он новее копируемого */
 		fprintf(stderr, "%s: %s нельзя копировать\n",
 			progname, file);
 	else if ((fin = open(file, 0)) == -1)
 		error("не открывается %s", file);
 	else if ((fout = creat(target, sti.st_mode)) == -1)
 		error("ошибка - не копируется %s", target);
 	else
 		while ((n = read(fin, buf, sizeof buf)) > 0)
 			if (write(fout, buf, n) != n)
 				error("error writing %s", target);
 	close(fin);
 	close(fout);
 }
 
 

53. самый простой вариант - system , затем - execlp и execvp

 	execlp ("/bin/sh/", "sh", "-с", commandline, (char*) 0);
 	execvp (filename, argp);
 
 

54.

 Синтаксис команды :
 	$ waitfile filename [command]
 периодически проверяет поименованный файл. Если он не менялся после последней
 проверки, выполняется command.
 
 	int fd;
 	struct stat stbuf;
 	time_t old_time = 0;
 
 	if ((fd = open("file", 0)) == -1)
 		error("can't open %s", 'file');
 	fstat(fd, &stbuf);
 	while (stbuf.st_mtime != old_time) {
 		old_time = stbuf.st_mtime;
 		sleep(60);
 		fstat(fd, &stbuf);
 	}
 	if (argc == 2) {	/* если нет аргумента command */
 		execlp("cat", "cat", 'file', (char *) 0);
 		error("can't execute cat %s", 'file');
 	} else {			/* run process */
 		execvp(argv[2], &command);
 		error("can't execute %s", command);
 	}
 
 
 

55. /dev/tty открыта с режимом 2 - чтение и запись. С помощью dup формируются стандартный входной и выходной потоки. Здесь можно провести аналогию со сборкой системой стандартных входного и выходного потоков и потока ошибок, когда вы в нее входите.Функция управляет процессами.

 void system(s)	/* run command line s */
 	char *s;
 {
 	int status, pid, w, tty;
 	int (*istat)(), (*qstat)();
 	char *progname;
 
 	fflush(stdout);
 	tty = open("/dev/tty", 2);
 	if (tty == -1) {
 		fprintf(stderr, "%s: can't open /dev/tty\n", progname);
 		return -1;
 	}
 	if ((pid = fork()) == 0) {
 		close(0); dup(tty);
 		close(1); dup(tty);
 		close(2); dup(tty);
 		close(tty);
 		execlp("sh", "sh", "-c", s, (char *) 0);
 		exit(127);
 	}
 	close(tty);
 	istat = signal(SIGINT, SIG_IGN);
 	qstat = signal(SIGQUIT, SIG_IGN);
 	while ((w = wait(&status)) != pid && w != -1)
 		;
 	if (w == -1)
 		status = -1;
 	signal(SIGINT, istat);
 	signal(SIGQUIT, qstat);
 	return status;
 }
 
 

56. Системный вызов signal изменяет действие, заданное по умолчанию. Он имеет два аргумента: номер, определяющий сигнал, и адрес функции или код, предписывающий игнорировать сигнал либо запустить процедуру, принятую по умолчанию.

 игнорирует стандартную реакцию системы
 	signal(SIGINT, SIG_IGN);
 восстанавливает стандартную реакцию системы
 	signal(SIGINT, SIG_DEL);
 Если второй аргумент signal представляет собой имя функции, 
 которая уже должна быть описана в том же самом исходном файле, 
 то функция будет вызвана, когда возникнет сигнал.
 
 Следующий пример подчищает временный файл
 
     if(signal(SIGINT, SIG_IGN) != SIG_IGN)
         signal(SIGINT, onintr);
 	...
 
 onintr() { /* почистить, если прервано */
     unlink(tempfile);
     exit(1);
 }
 
 
 

57. синтаксис вызова команды

 	timeout -3600 watchfor dmg &
 
 
 #include < stdio.h>
 #include < signal.h>
 int	pid;		/* child process id */
 char *progname;
 
 main(argc, argv)
 	int argc;
 	char *argv[];
 {
 	int sec = 10, status, onalarm();
 
 	progname = argv[0];
 	if (argc > 1 && argv[1][0] == '-') {
 		sec = atoi(&argv[1][1]);
 		argc--;
 		argv++;
 	}
 	if (argc < 2)
 		error("Usage: %s [-10] command", progname);
 	if ((pid=fork()) == 0) {
 		execvp(argv[1], &argv[1]);
 		error("couldn't start %s", argv[1]);
 	}
 	signal(SIGALRM, onalarm);
 	alarm(sec);
 	if (wait(&status) == -1 || (status & 0177) != 0)
 		error("%s killed", argv[1]);
 	exit((status >> 8) & 0377);
 }
 
 onalarm()	/* kill child when alarm arrives */
 {
 	kill(pid, SIGKILL);
 }
 
 

1.

 1. Answer:
         Compiler error: Cannot modify a constant value. 
 
1.
 2. Answer:
 5 4 3 2 1
 Explanation:
 When static storage class is given, it is initialized once.
 
1.
 3. Ответ: 2222223456
 
1.
 4. Ошибка : внешняя переменная должна быть определена в другом файле
 
1.
 5. Answer:
             0 0 1 3 1
 Во первых , значение каждой переменной будет инкрементировано на 1
 m=1 ,  потому что сначала  -1 && -1 && 0 = 0 ,
 а потом 0 || 2 = 1 
 
1.
 6. Ответ:
 1 4
 1 байт для типа char и 4 байта для хранения адреса символьного указателя
 
1.
 7. Ответ : H
 Сначала идет разименование указателя , потом присваивание адреса , потом опять разименование
 
1.
 8.
 Ответ : 4 5 5
 sizeof(str1) - стандартный размер указателя
 sizeof(str2) - 4 символа + ноль в конце = 5
 
1.
 9. Ответ : 0
  В си ноль - это FALSE , и любое не-нулевое значение есть TRUE
 Поэтому имеем : TRUE не равно TRUE , что явно бред , или FALSE , или 0
 
1.
 10 Ответ :
 	98
 	98	
 	1
 	1
 Префиксный инкремент делает приращение ПЕРЕД принтом , постфиксный - после ,
 поэтому 2 строки одинаковые
 
1.
 11 Ответ : 12 , как ни странно
 
1.
 12. Ответ : ошибка компиляции
 Инициализауия не может быть сделана внутри структуры
 
1.
 13. Ответ : ошибка компиляции в строке a++
 *a - указатель на начало массива , это корректно , но приращение указателя - некорректно  
 Можно вот так - т.е. сделать инкремент первого элемента массива :
 	(*a)++;
 В этом случае будет напечатано :
 10
 11
 12
 13
 14
 А приращение самого указателя делать нельзя , потому что он константный
 
 
1.
 14. Ответ :
 1 1 1
 
 первое число - ptr-p : ptr - указатель на 1 , p - на ноль
 второе число  *ptr-a : *ptr - указатель на 1 , a - на ноль
 третье число  **ptr  : это указатель на 1
 
1.
 15. Ответ : g20fy
 
1.
 16. Ответ
 girl
 irl
 rl
 l
 

2.

 char s1[10];
 sprintf(s1,"%d\n",25);
 
 

3. Копирование src в dest

 char *strcpy(char *dest, const char *src);
 char *strncpy(char *dest, const char *src, size_t n);
 
 Во второй функуии часто допускают багу : если в src нет символа '\0' , 
 то результирующая строка не будет закрыта
 

4. assert - это макрос , в данном примере когда в цикле переменная достигнет значения 5 , условие в ассерте не выполнится , и он сработает , терминируя программу

 for(i=0;i <=10;i++)
 {
   assert(i < 5);
 }
 
 

5.

    void *memchr(const void *s, int c, size_t n);
 		Функция memchr() ищет символ c в первых n байтах той области памяти, на которую указывает s.
 
    int memcmp(const void *s1, const void *s2, size_t n);
 		Функция memcmp() сравнивает первые n байтов областей памяти s1 и s2. 
 
    void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
 		Функция memcpy() копирует n байтов из области памяти src в область памяти dest.
 		Области памяти не могут перекрываться.  
    
    void *memmove(void *s1, const void *s2, size_t n);
 		Функция memmove() копирует n байтов из области памяти src в облать памяти dest. 
 		Области памяти могут перекрываться.  
 
    void *memset(void *s, int c, size_t n);
 		заполняет память определенным символом  
 
    char *strcat(char *restrict s1, const char *restrict s2);
 		Функция strcat() добавляет строку str к строке dest, перезаписывая символ `\0' в конце dest, 
 		и добавляя завершающий символ `\0'.
 		Функция strncat() работает похожим образом, но добавляет к dest только первые n символов строки src.  
 
 
    char *strchr(const char *s, int c);
 		Функция strchr() возвращает указатель на первое вхождение символа c в строке s. 
 
    int strcmp(const char *s1, const char *s2);
 		Функция strcmp() сравнивает две строки s1 и s2.		
 
    char *strcpy(char *restrict s1, const char *restrict s2);
 		Функция strcpy() копирует строку, указанную как src (включая завершающий символ `\0'), 
 		в массив, указанный как dest.
 
    size_t strcspn(const char *s1, const char *s2);
 	Функция strspn() вычисляет длину начального сегмента строки s, 
 	состоящего только из символов строки accept.
 
    char *strdup(const char *s1);
 		Функция strdup возвращает указатель на новую строку, являющуюся дубликатом строки s.
 
    size_t strlen(const char *s);
 		Функция strlen() вычисляет длину строки s, не считая завершающий символ `\0'.  
 
    char *strstr(const char *s1, const char *s2);
 		Функция strstr() ищет первое вхождение подстроки needle в строке haystack. 
 		Завершающий символ `\0' не сравнивается.
 
    char *strtok(char *restrict s1, const char *restrict s2);
 		Функцию strtok() можно использовать для разделения строки s на токены. 
 		При первом вызове strtok() необходимо указать s первым аргументом. 
 		В последующих вызовах в качестве первого аргумента нужно использовать NULL. 
 		Каждый вызов возвращает указатель на следующий токен, или NULL, 
 		если токенов больше не обнаружено. 
 
 

6.

 	if(strcmp(string1, string2) == 0) 
 

7. World

 В случае :
 if(!0) - Hello
 

8. goto - переход на локальную ссылку внутри данной функции, longjmp() and setjmp() - на глобальную ссылку за пределами функции. Вначале , когда делается вызов setjmp() , текущее состояние программы записывается в структуру jmp_buf. В дальнейшем , для возвращения этого состояния , можно вызвать longjmp(). Но после возвращения все данные , которые были выделены перед этим динамически , будут утеряны . К применению не рекомендовано .

 
 

9. В первом случае произойдет инкремент самого указателя (потому что инкремент имеет более высокий приоритет , чем указатель), во втором случае произойдет инкремент значения , на которое указывает указатель. Пример :

 	int a[]={10,12,14};
 	int *p = a;
 	*p++;
 	printf("%d\n",*p);
 	(*p)++;
 	printf("%d\n",*p);
 
 Будет распечатано :
 12
 13
 Т.е. сначала 	указатель переместится на второй индекс массива , а потом сделает
 приращение для второго индекса массива
 

10. NULL-указатель гарантированно не указывает ни на какой обьект , а непроинициализированный указатель может указывать куда угодно

 
 

11. Не обязательно . Оба варианта валидны :

 	int *myarray;
 	myarray = (int *)malloc(10 * sizeof(int));
 	myarray = malloc(10 * sizeof(int));
 

12.

 1. const char *p - указатель на константный символ
 	символ не может быть изменен , но может быть изменен сам указатель , т.е. :
 	*p = 'A' - нельзя
 	 p = "blabla" - можно
 2. char * const p - константный указатель на неконстантный символ
 	символ может быть изменен , но не может быть изменен сам указатель , т.е. :
 	*p = 'A' - можно
 	 p = "blabla" - нельзя
 3.const char * const p - константный указатель на константный символ 
 	ничего менять нельзя
 

13. указатель типа void - это указатель на неопределенный тип , поэтому компилятор просто не знает , как применить к нему арифметические операции. Для этого перед указателем надо поставить явное приведение типа :

  (char *)(void *)
 или
 (int * )(void *)
 
 

14.

 Массив указателей :
 int *p[10];
 
 Указатель на массив :
 int (*p)[10];
 
 

15.

 brk устанавливает конец сегмента данных процесса в значение, указанное в аргументе end_data_segment, 
 sbrk увеличивает пространство данных программы на increment байт.
 
 

16. reference counter - счетчик , указывающий , сколько указателей работают с выделенной памятью. При создании указателя , обращающегося к выделенной памяти , такой счетчик увеличивается на единицу. При удалении он уменьшается . Когда он становится равным нулю , выделенную память надо освобождать.

 
 

17.

 1. Копирование	
     px=py
 2. Сравнение
     px==py
     px==NULL
 3. Инкремент , декремент
     px=px+n
     px=px-n
 4. Вычитание - сложение
     px-py 
 	px+py
 
 
 

18.

  1. Непроинициализированный указатель
 		Неверный подход :
 			int *p; 
 			*p = 12; 
 		Правильный подход :
 			int i = 12;
 			int *p; 
 			p = &i; 
 
 2. Invalid pointer refernce - когда указатель указывает на несуществующую область памяти
 
 

19. Нет

 
 

20. Inline-функция будет растиражирована в коде компилятором столько раз , сколько она вызывается - это делается для того , чтобы минимизировать время работы со стеком , регистрами . Эти функции приводят к разбуханию исполняемого кода . Это подходит для малых по размеру функций , но не подходит для больших , а также рекурсивных функций .

 
 

21. Нужно подключить stdarg.h , использовать префикс ... в обьявлении , а также макросы va_start , va_arg , va_end. Примером такой функции является printf .

 #include < stdarg.h>
 
 int myfunction(char *first_argument,...)
 {
 	int length;
 	va_list argp;
 	va_start(argp, first_argument);
 	char *p;
 	
 	length = strlen(first_argument);
 	while((p = va_arg(argp, char *)) != NULL)
 	{
 		length = length + strlen(p);
 	}
 	
 		
 	va_end(argp);
 	return(length);
 }
 
 int main()
 {
 	int length;
 	length = myfunction("Hello","Hi","Hey!",(char *)NULL);
 	printf("%d\n",length);
 	return(0);
 }
 

22. По значению

 
 

23. Сдвинуть вправо на 1 значение

 		int num=12;
       	num >>= 1;
 
 Соответственно
       	num >>= 2;
 будет равносильно делению на 4
 
 

24. В первом случае все библитечные функции попадают в в исполняемый бинарный файл , во втором просто вызываются из библиотек , которые имеют расширение .so или .sa.

  
 

25.

 Binary search                                :    O(log(n))
 Finding max & min for a given set of numbers :    O(3n/2-2)
 Merge Sort                                   :    O(n*log(n))
 Insertion Sort                               :    O(n*n)
 Quick Sort                                   :    O(n*log(n))
 Selection Sort                               :    O(n*n)
 
 

26. Вся память , выделяемая процессу , может быть поделена на 3 области : текст , стек и куча . Текст - это программный код . Стек - это вызов функций , передача параметров , локальные переменные функции , который работает по принципу LIFO . Куча - это хранение глобальных и статических переменных , а также память , выделяемая под динамическое выделение . Функции malloc(), calloc(), and realloc() работают с кучей .

 
 

27. Ссылка всегда ссылается на какой-то обьект , а указатель может быть непроинициализирован. Ссылка не может поменять обьект , на который она ссылается , в то время как указатель можно указать на другой обьект.

 
 

28. Если static применяется для переменной , обьявленной внутри функции , она становится видимой между функциями . Если static применяется для переменной , обьявленной между функций , она становится видимой только внутри файла . Если static применяется для функции , то функция становится видимой внутри данного файла (хотя по умолчанию она extern) , то же самое и для extern-переменной. Если static-переменная определена в хидер-файле , она становится видимой везде .

 
 

29.

 a[i] == *(a+i)
 a[i][j] == *(*(a+i)+j)
 a[i][j][k] == *(*(*(a+i)+j)+k)
 a[i][j][k][l] == *(*(*(*(a+i)+j)+k)+l)
 

30. Возможны несколько вариантов :

 int a=7;
 int b=2;
 
 Первый :
 a = a + b;
 b = a - b;
 a = a - b;
 
 Второй :
    a= a^b;
    b= b^a;
    a= a^b;
 
 Третий:
 a^=b^=a^=b;
 
 

31. Для оптимизации или наоборот отмены . register - для хранения переменных в регистрах , volatile - наоборот , для отмены оптимизации .

 
 

32.

 atof() -> float
 atoi() -> integer.
 atol() -> long integer.
 strtod() -> floating-point + reports 
 strtol() -> long integer + reports 
 strtoul() -> unsigned long integer + reports 
 

33 Функция realloc имеет 2 аргумента :

 ptr - указатель на область памяти
 size - число байт , на которые будет увеличена/уменьшена эта область
 
 создается новый регион памяти нового размера , куда помещаются все старые данные
 

34. ANSI C говорит , что 12 :

 int ************ip12 ;
 

35. Их 6 :

 _ _LINE_ _ Inserts the current source code line number in your code.
 _ _FILE_ _ Inserts the current source code filename in your code.
 _ _ Inserts the current date of compilation in your code.
 _ _TIME_ _ Inserts the current time of compilation in your code.
 _ _STDC_ _ Is set to 1 if you are enforcing strict ANSI C conformity.
 _ _cplusplus Is defined if you are compiling a C++ program. 
 

36. Это директива препроцессора , которая вкллючает/выключает фичи компилятора

 например , включить опцию оптимизации
 #pragma loop_opt(on) 
 отключить опцию оптимизации
 #pragma loop_opt(off) 
 
 

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

 
 

38. Статический и динамический

 Статический :
 int a=5;
 int *b=&a;
 
 Динамический :
 int *b = malloc(5*size(int));
 

39. Распечатать первые 10 символов

 printf("%.10s\n","1234567890asdfghjklo"); 
 

40. 0 1 2 3 4

 
 

41. 1 2 3

 
 

42. 6 - это число символов в строке "543210"

 
 

43. время компиляции , имя файла , номер текущей строки в файле

 
 

44. 123 423 563 789

  во втором вызове print будет заменен первый аргумент на 4 ,
  в третьем вызове - первые два на 5 и 6
  в третьем - все 3
 

45. Будет напечатано : 120

 будет интерпретация :
 10+10*10+10 = 120
 

46. char *strstr(const char *haystack, const char *needle);
Функция strstr() ищет первое вхождение подстроки needle в строке haystack. Завершающий символ `\0' не сравнивается.

 
 char* str_str ( char* cp_str, char* cp_pattern )
 {
 	char* cp_temp = NULL;
 	int n_pattern_length = 0;
 	n_pattern_length = strlen ( cp_pattern );
 	while ( *cp_str !='\0' ) 
 	{
 		if ( !strncmp ( cp_str, cp_pattern, ( n_pattern_length ) ) ) 
 		{
 			cp_temp = cp_str;
 			break;
 		}
 		else cp_str++;
 	}
 	return ( cp_temp );
 }
 
 int main ( int argc, char* argv [ ] )
 {
 	char array [] = {"Hello World"};
 	char* cp_temp = NULL;
 	cp_temp = str_str ( array, "asd" );
 }
 

47.

 int	number=20;
 int	position=3;
 
 	result = (number >>(position-1));
 
 	if(result & 1)
 		printf("Bit is Set");
 	else
 		printf("Bit is Not Set");
 
 

48.

 int a=16;
 a=a>>4;
 if(a%2==1)
 printf("the bit is set");
 else
 printf("the bit is not set");
 
 

49.

 int i,a;
 int n=12345;
 for(i=0;n>0;i++)
 {
 a=n%10;
 n=n/10;
 printf("%d\n",a);
 }
 
 

50. Будет распечатано : 2 10 12 16 9

  int x = 1; 
  тут инкремент переменной произойдет после вывода дважды :
  printf("%d\n", x++ + x++ ) ; // 1+1   x=3
 
  тут инкремент переменной произойдет до вывода 2 раза
  printf("%d\n", ++x + ++x) ;  // 5+5   x=5
 
  тут инкремент переменной произойдет до вывода 1 раз и после вывода 1 раз
  printf("%d\n", ++x + x++ ) ; // 6+6   x=7
 
  тут инкремент переменной произойдет до вывода 1 раз и после вывода 1 раз
  printf("%d\n", x++ + ++x ) ; // 8+8   x=9
 
 

51. 10 30 31

 value = *data_ptr++; // тут value=10 и переход на второй элемент массива
 value = *++data_ptr; // тут переход на 3-й элемент массива и value=30  
 value = ++*data_ptr; // тут инкремент 3-го элемента и value=31
 

52. в первом случае это массив из 10 указателей , во втором - указатель на массив из 10 целых чисел

 
 

53.

 #define BIT3	(0x1 <<  2)
 
 int a=20;
 a &= ~BIT3;  // установка 3-го бита в ноль
 a |= BIT3;   // установка 3-го бита в единицу
 
 

54. Как ни странно , >6

  Если в операции участвует хотя бы одно unsigned , то и результат получится  unsigned ,
 причем огромадное целое положительное число .
 

55.

 Операция
 	c = a +++ b;
 будет интерпретирована как
 	c = a++ + b;
 что даст в сумме 12