#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STR_HOSSZ 101
//kiíratás betűnként
void betuz(char* c);
//kiíratás egyben
void kiir(char* c);
int main(void)
{
// Programterületen található szövegre mutató pointer
char* string = "C szoveg"; //a tömböt \0 zárja (nem módosítható)
betuz(string); //kiíratás betűnként
kiir(string);
//string[1] = '-'; //nem írható - csak olvasható
string = "Char *"; //átdefiniálható
kiir(string);
//Karaktertömb
char a[21] = "karakter"; //max 20 betű + \0 (\0 automatikus)
char b[] = { 't', 'o', 'm', 'b', '\0' }; //4 karakter + \0- t meg kell adni!!!
//a = "String"; //nem használható pointer művelt
a[0] = 'K'; //tömb elemenként módosítható
a[4] = 'K';
kiir(a);
printf("A b string hossza: %i\n", strlen(b)); // hossz \0-ig
printf("A b memoria merete: %i\n", sizeof(b));
//dinamikus
char* cpt = (char*)malloc(STR_HOSSZ); //100 betű tárolására lesz alkalmas
cpt[0] = 'a'; cpt[1] = 'b'; cpt[10] = 0; //ismeretlen tartalom \0-ig
kiir(cpt);
memset(cpt, 0, STR_HOSSZ); //cpt összes eleme 0
//lehetne strset(cpt,'\0'); de csak char *-ra működik
//másolás
//cpt = a; //ez nem másolás, csak ugyanoda fog mutatni!!!
int i = 0;
while (a[i]) //while(a[i]==0) - nem tudjuk a hosszát \0-ig kell menni
{
cpt[i] = a[i]; //cpt[i] = a[i++];
i++;
}
cpt[i] = NULL; //záródó \0
kiir(cpt);
//hozzáfűzés
char* tmp = b; //ugyanoda mutat
// i = 0; //ha i=0 lenne, akkor csak b másolása lenne
while (*tmp) //while(*s_tmp!=NULL)
{
cpt[i] = *tmp; //cpt[i++]=*tmp++ léptetéssel eggyütt
tmp++; i++; //külön léptetés
}
cpt[i] = NULL;
kiir(cpt);
// cpt = a helyett strcpy másolás, _s biztonságos verziónál meg kell adni a cél méretét, hogy ne lehessen túlírni
strcpy_s(cpt, STR_HOSSZ, a); //biztonságos verzió(hova, maximum mennyit szabad, miből)
kiir(cpt);
memset(cpt, 0, STR_HOSSZ); //karaketer tömb ürítése
strncpy_s(cpt, STR_HOSSZ, a, 3); //n db karater átmásolása, biztonságos verzió \0-t is hozzáadja
kiir(cpt);
strcpy_s(a, sizeof(a), b); //a maximum méret statikus tömböknél sizeof()-al megadható
kiir(a);
// új érték adására is jó
strcpy_s(a, sizeof(a), "char ");
strcpy_s(b, sizeof(b), "*");
//Összefűzés
strcat_s(a, sizeof(a), b); //strcat(mihez, max mennyit szabad, mit) az első \0-t cseréli ki a mit-re
kiir(a);
//Összefűzés n darab
strncat_s(a, sizeof(a), " +5 karakter", 5); //hozzáfűzzünk 5 karaktert ('a' nem lehet nagyobb, mint 20 karakter!!!)
kiir(a);
char s2[STR_HOSSZ]; //másoljuk bele 2x az a[]-t
strcpy_s(s2, STR_HOSSZ, a); //1. strcpy
strcat_s(s2, STR_HOSSZ, " ");
strcat_s(s2, STR_HOSSZ, a); //2. strcat
kiir(s2);
//keresés - karaktert
tmp = strchr(s2, 'r'); //strchr visszaadja a karakterre mutató pointert vagy NULL-t ha nincs
kiir(tmp);
tmp = strrchr(s2, 'r'); //strrchr visszaadja az utolsó karakterre mutató pointert
kiir(tmp);
//betű megszámlálása
tmp = s2;
int db = 0;
while (tmp)
{
tmp = strchr(tmp, 'k');
if (tmp)
{
tmp++; //átlépjük a 'k' karaktert
db++;
}
}
printf("A k betuk szama: %i\n", db);
//keresés - sztringet
tmp = strstr(s2, "ar"); //strstr visszaadja a sztringre mutató pointert
kiir(tmp);
char se[STR_HOSSZ]; //string eleje
memset(se, 0, STR_HOSSZ); //feltöltés /0-val, de
strncpy_s(se, sizeof(se), s2, tmp - s2); //biztonságos n-es verziónál /0 it átmásolva
kiir(se);
//STRTOK !!!! az eredeti tartalmat szétszedi úgy, hogy \0-t rak be a szeparáló elem helyére
char adatok[] = "1.2;24.5;42.6;64";
char delim[] = ";";
char* p, * next;
//strcpy_s(cpt, STR_HOSSZ, adatok); //ha kell biztonsági másolat
p = strtok_s(adatok, delim, &next); //első híváskor
while (p)
{
kiir(p);
p = strtok_s(NULL, delim, &next); //további híváskor NULL
}
printf("Ez maradt az adatokbol: %s\n", adatok);
//Adatbevitel
printf("kerek egy szoveget: ");
gets_s(s2, STR_HOSSZ)); //biztonságos Enter-ig, Enter-t nem tárolja
for (i = strlen(s2) - 1; i >= 0; i--) //megfordít
printf("%c", toupper(s2[i])); //toupper
printf("\n");
free(cpt);
return 0;
}
//kiíratás betűnként
void betuz(char* c)
{
while (*c) //while(*c!=NULL)
{
printf("'%c' ", *c++);
}
printf("\n");
}
//kiíratás egyben
void kiir(char* c)
{
if (c) printf("%s\n", c);
}