1. Текстуални низи (стрингови)
1.1. Потсетување од предавања
1.1.1. Функции за работа со текстуални низи од библиотеката <string.h>
Функции за менување на текстуални низи:
-
strcpy()
- копирање на една текстуална низа во друга -
strncpy()
- копирање на n бајти од една текстуална низа во друга -
strcat()
- надоврзува една текстуална низа на крајот на друга -
strncat()
- надоврзува n бајти од една текстуална низа на крајот на друга
Функции за менување на меморијата:
-
memset()
- пополнува низа со одреден бајт
Функции за претворање на текстуални низи во броеви:
-
atof()
- претвора текстуална низа во децимален број -
atoi()
- претвора текстуална низа во цел број
Функции за испитување на текстуални низи:
-
strlen()
- ја враќа должината на дадена текстуална низа -
strcmp()
- споредува две текстуални низи -
strncmp()
- споредува n бајти од две текстуални низи -
strchr()
- го наоѓа првото појавување на даден знак во текстуална низа -
strrchr()
- го наоѓа последното појавување на даден знак во текстуална низа -
strspn()
- во текстуална низа го наоѓа првото појавување на знак кој не припаѓа на специфицирано множество од знаци -
strcspn()
- во текстуална низа го наоѓа последното појавување на знак кој не припаѓа на специфицирано множество од знаци -
strpbrk()
- во текстуална низа го наоѓа првото појавување на знак кој припаѓа на специфицирано множество од знаци -
strstr()
- во текстуална низа го наоѓа првото појавување на дадена подниза
1.1.2. Функции за работа со знаци од библиотеката <ctype.h>
Функции за работа со единечен знак:
-
isalnum()
- проверува дали даден знак е алфанумерички (буква или цифра) -
isalpha()
- проверува дали даден знак е буква -
iscntrl()
- проверува дали даден знак е контролен знак -
isdigit()
- проверува дали даден знак е декадна цифра -
isxdigit()
- проверува дали даден знак е хексадекадна цифра -
isprint()
- проверува дали даден знак може да се печати -
ispunct()
- проверува дали даден знак е интерпункциски знак -
isspace()
- проверува дали даден знак е празно место -
islower()
- проверува дали даден знак е мала буква -
isupper()
- проверува дали даден знак е голема буква -
tolower()
- претвора дадена голема буква во соодветната мала буква -
toupper()
- претвора дадена мала буква во соодветната голема буква -
isgraph()
- проверува дали даден знак има локална графичка репрезентација
1.2. Задача 1
Да се напише функција што ќе одредува колку пати даден знак се наоѓа во даден стринг. Знакот за споредување и стрингот се внесуваат од тастатура.
За стрингот
HELLO FINKI
знакот L
се појавува 2 пати.
p10_1.c
#include <stdio.h>
#define MAX 100
int count_char(char *str, char c) {
int vkupno = 0;
while (*str != '\0') {
vkupno += (*str == c);
str++;
}
return vkupno;
}
int main() {
char s[MAX], c;
gets(s);
c = getchar();
printf("%d\n", count_char(s, c));
return 0;
}
1.3. Задача 2
Да се напише функција што ќе ја одредува должината на една текстуална низа.
Да се даде итеративно и рекурзивно решение.
Ако на функцијата како аргумент и се предаде стрингот
zdravo!
тогаш таа треба да врати: 7
p10_2.c
#include <stdio.h>
#define MAX 100
int length(char *s) {
int i, len = 0;
for (i = 0; s[i] != '\0'; i++)
len++;
return len;
}
int length_r(char *s) {
if (*s == '\0')
return 0;
return 1 + length_r(s + 1);
}
int main() {
char s[MAX];
gets(s);
printf("Dolzhina: %d i %d\n", length(s), length_r(s));
return 0;
}
1.4. Задача 3
Да се напише програма која ќе ја отпечати поднизата на дадена текстуална низа (што се внесува од тастатура) определена со позицијата и должината, што како параметри се внесуваат од тастатура. Поднизата започнува од знакот што се наоѓа на соодветната позиција во текстуалната низа, броејќи од лево.
Ако од тастатура се внесе:
banana
позиција: 3
должина: 4
тогаш програмата треба да отпечати: nana
p10_3.c
#include <stdio.h>
#include <string.h>
#define MAX 100
int main() {
char s[MAX], dest[MAX];
int pozicija, dolzhina;
gets(s);
scanf("%d %d", &pozicija, &dolzhina);
if (pozicija <= strlen(s)) {
strncpy(dest, s + pozicija - 1, dolzhina);
dest[dolzhina] = '\0';
printf("Rezultat: ");
puts(dest);
} else
printf("Nevaliden vnes, prochitaniot string ima samo %d znaci.\n",
strlen(s));
return 0;
}
1.5. Задача 4
Да се напише функција која ќе одредува дали една текстуална низа е подниза на друга текстуална низа.
face
е подниза на Please faceAbook
p10_4.c
#include <stdio.h>
#include <string.h>
#define MAX 100
int podstring(char *s1, char *s2) {
int i;
int d1 = strlen(s1);
int d2 = strlen(s2);
if (d1 > d2)
return 0;
for (i = 0; i <= d2 - d1; i++)
if (strncmp(s1, s2 + i, d1) == 0)
return 1;
return 0;
}
int main() {
char s1[MAX], s2[MAX];
gets(s1);
gets(s2);
if (podstring(s1, s2))
printf("%s e podstring na %s\n", s1, s2);
else
printf("%s NE e podstring na %s\n", s1, s2);
return 0;
}
1.6. Задача 5
Да се напише функција која ќе проверува дали дадена текстуална низа е палиндром.
Една текстуална низа е палиндром ако таа се чита исто од лево на десно и од десно на лево.
dovod ana kalabalak
p10_5.c
#include <stdio.h>
#include <string.h>
#define MAX 100
int e_palindrom(char *str) {
int i, n = strlen(str);
for (i = 0; i < n / 2; i++)
if (*(str + i) != *(str + n - 1 - i))
return 0;;
return 1;
}
// REKURZIVNO
int e_pal(char *str, int start, int end) {
if (start >= end) return 1;
if (str[start] == str[end])
return e_pal(str, start + 1, end - 1);
return 0;
}
int main() {
char s[MAX];
gets(s);
printf("%s ", s);
if (e_pal(s, 0, strlen(s) - 1))
printf("e palindrom.");
else
printf("NE e palindrom.");
return 0;
}
1.6.1. Задача 5-а (за дома)
Да се напише функција која ќе проверува дали дадена реченица е палиндром. При проверката да се игнорираат празните места, интерпункциските знаци, а соодветните мали и големи букви да се сметаат за еднакви (A
== a
, B
== b
, итн.).
Jadejne i pienje daj! A man, a plan, a canal, Panama. Never odd or even. Rise to vote sir!
1.7. Задача 6
Да се напише функција која за дадена текстуална низа ќе одредува дали таа е доволно сложена за да биде лозинка.
Секоја лозинка мора да содржи барем една буква, барем една цифра и барем еден специјален знак.
zdr@v0!
е валидна лозинка.
zdravo
не е валидна лозинка.
p10_6.c
#include <stdio.h>
#include <string.h>
#define MAX 100
int e_validna_lozinka(char *str) {
int bukvi = 0, cifri = 0, spec = 0;
for (; *str; str++) {
if (isalpha(*str))
bukvi++;
else if (isdigit(*str))
cifri++;
else
spec++;
}
return (bukvi > 0 && cifri > 0 && spec > 0);
}
int main() {
char s[MAX];
gets(s);
printf("%s ", s);
if (e_validna_lozinka(s))
printf("e validna lozinka.");
else
printf("NE e validna lozinka.");
return 0;
}
1.8. Задача 7
Да се напише функција која во стринг што и се предава како влезен параметар ќе ги промени малите букви во големи и обратно, и ќе ги отстрани сите цифри и специјални знаци.
За низата:
0v@ePr1m3R
треба да се добие:
VEpRMr
p10_7.c
#include <stdio.h>
#include <string.h>
#define MAX 100
void filter(char *str) {
int i = 0, j = 0;
while (str[i] != '\0') {
if (isalpha(str[i])) {
if (islower(str[i]))
str[j] = toupper(str[i]);
else if (isupper(str[i]))
str[j] = tolower(str[i]);
j++;
}
i++;
}
str[j] = '\0';
}
int main() {
char s[MAX];
gets(s);
filter(s);
printf("%s\n", s);
return 0;
}
1.9. Задача 8
Да се напише функција која во дадена текстуална низа ќе ги отстранува празните места на почетокот и крајот од низата.
За низата:
" make trim "
треба да се добие:
"make trim"
p10_8.c
#include <stdio.h>
#include <string.h>
#define MAX 100
void trim(char *s) {
char *d = s;
while (isspace(*s++))
;
s--;
while (*d++ = *s++)
;
d--;
while (isspace(*--d))
*d = 0;
}
int main() {
char s[MAX];
gets(s);
printf("[%s] -> ", s);
trim(s);
printf("[%s]", s);
return 0;
}