Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 www.iakovlev.org 

 

Язык программирования Си ,(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