Vissza

Karakterláncok


I. Egy szövegállományban nevek vannak. Hozzunk létre egy kétdimenziós karakter-tömböt, amelynek dinamikusan foglaljunk helyet és végezzük el a következőket:
  • írjuk át egy másik kétdimenziós tömbbe az 'a' betűvel kezdődő neveket,
  • rendezzük az újonnan létrehozott tömböt, majd írjuk ki a rendezett tömböt egy szövegállományba,
  • olvassunk be egy nevet a billentyűzetről és vizsgáljuk meg, hogy szerepel-e a kétdimenziós tömb nevei között, a keresés során ne tegyünk különbséget a kis és nagybetűk között ( Forráskód )
II. Egy szövegállomány tartalmát nagybetűsítsük, soronként kiolvasva egy dinamikusan létrehozott tömbbe az állomány tartalmát.

III. Készítsünk karakter előfordulási statisztikát egy szöveges-állományon.

IV. Írjuk meg a követkő függvényeket:
  • Visszateríti a paraméterként megadott karakterlánc hosszát: 
  • A második paraméterként megadott source karakterláncot másoljuk át az első paraméterként megadott dest karakterláncba, visszatérítve a dest karakterláncot:
    • char* my_strcpy(char* dest, char* source) ( Forráskód )
  • A második paraméterként megadott source karakterláncot fűzzük hozzá az első paraméterként megadott dest karakterlánchoz, visszatérítve a dest karakterláncot:
    • char* my_strcat(char* dest, char* source) ( Forráskód )
  • A paraméterként megadott két karakterláncot hasonlítsuk össze lexikografikus sorrend alapján. Ha egyenlők, akkor 0-t, ha az első a nagyobb, akkor 1-t, ha a második a nagyobb, akkor –1-t terítsen vissza a függvény:  
    • int my_strcmp(char * s1, char * s2)
  • Vizsgáljuk meg, hogy a paraméterként megadott c karakter előfordul-e a paraméterként feltüntetett s1 karakterláncban. Ha benne van, akkor egy mutató legyen a visszatérítési érték mely az első előfordulási pozíciót határozza meg, ha nincs benne, akkor NULL értéket térítsen vissza:
    • char* my_strchr(char *s, int c)
  • Vizsgáljuk meg, hogy a paraméterként megadott s2 karakterlánc előfordul-e a paraméterként feltüntetett s1 karakterláncban. Ha benne van, akkor egy mutató legyen a visszatérítési érték, amely az első előfordulási pozíciót határozza meg. Ha az s2 értéke üres karakterlánc, akkor a visszatérítési érték az s1 karakterlánc legyen, ha nincs benne, akkor NULL értéket térítsen vissza:
    • char* my_strstr(char* s1, char* s2)
  • Határozzuk meg a paraméterként megadott karakterlánc fodított alakját.
    • char* my_strback(char *s)
V. Olvassuk be soronként egy szöveg állomány tartalmát ( Forráskód ). A szövegállomány névét a parancssor első argumentumaként adjuk meg. Az 1. pontnál megírt függvények alkalmazásával készítsük el a következő programokat. Kezeljük az előforduló hibákat.
  • írassuk ki a képernyőre azokat a sorokat, amelyekben megtalálható a parancssor második argumentumaként megadott karakterlánc,
  • a beolvasott szöveg sorait írassuk ki fordított sorrendbe,
  • a beolvasott szöveg azon sorait írassuk ki, amelyek hossza adott értéknél nagyobb,
  • töröljük a beolvasott szövegből a space és enter karaktereket.
VI. Írjunk programot, amely kiértékeli a parancssor argumentumában megadott aritmetikai műveletet két operandus között. Az operátorokat ( + - * / ) és az operandusokat szóköz választja el.
 

Forráskódok:
I.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void nagybetusit(char * my_str);

int main(){
    FILE *F, *G;
    int i, n;
    char *nev, **sor;
    F = fopen ("labor3.c", "r");
    G = fopen ("ki.txt", "w");
    fscanf (F, "%i\n", &n);
    fprintf (G, "%i\n", n);
    nev = (char*) malloc (80*sizeof (char) );
    sor = (char**) malloc (n*sizeof (char*) );
    for( i = 0; i < n; ++i)
        sor[i] = (char*) malloc (80*sizeof(char) );
    for(i=0; i<n; ++i){
        fgets (sor[i], 80, F);
        fputs (sor[i], G);
    }
    fclose (G);
    fclose (F);
    printf ("nev:");
    fgets (nev, 80, stdin);
    nagybetusit (nev);
    for( i = 0; i < n; ++i){
        nagybetusit (sor[i]);
        if (strcmp (nev, sor[i]) == 0) printf ("%i  %s\n", i, sor[i]);
    }
    for ( i = 0; i < n; ++i)
       free (sor[i]);
    free (sor);
    free (nev);
   
}

void nagybetusit(char * my_str){
    int i;
    for ( i = 0; i < my_str[i] != '\0'; ++i){
        if ( my_str[i] <= 'z' && my_str[i] >= 'a') my_str[i] -=32;
    }
}

Vissza

IV.1,3

#include <stdio.h>
#include <stdlib.h>

char *my_strcat (char *dest, char*source);
int my_strlen (char *s);

int main()
{
    char s1[40], s2[40];
    int h1, h2;
    printf ( "Kerek egy karakterlancot: ");
    scanf ( "%s", s1);
    printf ( "Kerek egy karakterlancot: ");
    scanf ( "%s", s2);
    printf ( "\n");

    h1 = my_strlen (s1);
    h2 = my_strlen (s2);
    printf("Az elso karakterlanc hossza: %i\n", h1);
    printf("A masodik karakterlanc hossza: %i\n", h2);
    printf("\n");

    my_strcat (s1, s2);
    printf("Osszefuzott string: %s\n", s1);
    printf("Regi string: %s\n", s2);
    return 0;
}

int my_strlen (char *s)
{
    int i;
    for (i = 0; *(s+i)!=0; i++);
    return i;
}

char *my_strcat(char *dest, char*source)
{
    for( ; *dest != 0; dest++);
    for( ; *source != 0; dest++,source++)
        *dest=*source;
    *dest = 0;
    return dest;
}

Vissza

IV. 2
char* my_strcpy(char* dest, char* source)
{
    int i;
    for(i=0 ; *(source+i) !='\0'; i++)   
            *(dest+i) = *(source+i);
    *(dest+i) = '\0';
    return dest;
}

// az alabbi valtozatban a dest memoriacim valtozik, nem terithetem vissza az erteket
int my_strcpy1(char* dest, char* source)
{
    for( ; *source!='\0'; dest++, source++)   
            *dest = *source;
    *dest='\0';
    return 0;
}

Meghivasi módok:
int main()
{
    char *string;
    string = (char*) malloc(20 * sizeof(char));//fontos!!!!
    string = my_strcpy( string, "Helo vilag" );
    printf( "String = %s\n", string );
    free (string);
    return 0;
}

// az alabbi valtozatban a 4. sorban hibas az ertekadas
int main()
{
    char string[80];
    string = my_strcpy( string, "Helo vilag" );
    printf( "String = %s\n", string );
    return 0;
}

// ez ujbol helyes
int main()
{
    char string[80];
    my_strcpy( string, "Helo vilag" );
    printf( "String = %s\n", string );
    return 0;
}

// a masodik valtozat, a strcpy1 hivodik meg
int main()
{
    char s1[80];
    my_strcpy1(s1,"helo vilag");
    printf( "String = %s\n", s1 );
    return 0;
}

Vissza

V.

#include <stdio.h>
int main(int argc, char * argv[])
{
    FILE *f;
    char sor[100];
    if (argc!=3)
    {
        printf("Hibas argumentum lista\n");
        return 0;
    }
    if( (f=fopen(argv[1],"r")) == NULL )
    {
        printf("Megnyitasi hiba\n");
        return 0;
    }
    while( (fgets(sor,100,f)) != NULL )
        //printf("%s",sor);
    fclose(f);
    return 0;
}

Vissza