Язык программирования Си ,(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 ?
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
};
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));
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();
}
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);
}
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;
}
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.
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,
если токенов больше не обнаружено.