IB001 Úvod do programování - Seminární skupina 25 a 26

Zpracování textu - zdrojový kód

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

#define STR_MAX 1024


void nactiVstup(char *str); // jmena v prototypu nemusi byt stejna
void velkaPismena(char*, char*); // nebo nemusi byt uvedena vubec
void malaPismena(char *str, char *vysledek); // doporucuji vsak jmena uvadet a zachovavat je
void obratRetezec(char *str, char *vysledek);
void spojRetezce(char *str, char *str2, char *vysledek);
void porovnejRetezce(char *str, char *str2, char *vysledek);
void najdiRetezec(char *str, char *str2, char *vysledek);

int main(void)
{
    char vstup1[STR_MAX];
    char vstup2[STR_MAX];
    char vysledek[STR_MAX];
    int volba = -1;

    printf("Zadej retezec:\n> ");
    nactiVstup(vstup1);   // pokud predavam pole, tak nemusim pouzivat & ... &pole[0] = pole

    printf("\nZadej co se ma udelat.\n"
           "1: prevest retezec na velka pismena\n"
           "2: prevest retezec na mala pismena\n"
           "3: obratit retezec\n"
           "4: zkopirovat retezec\n"
           "5: doplnit text do retezce\n"
           "6: porovnat retezec se zadanym\n"
           "7: vyhleda zadane slovo\n"
           "> ");

    scanf("%d", &volba);

    switch(volba)
    {
    case 1:
        velkaPismena(vstup1,&vysledek[0]); // ukazka ekvivalentniho volani
        break;
    case 2:
        malaPismena(vstup1,vysledek);
        break;
    case 3:
        obratRetezec(vstup1,vysledek);
        break;
    case 4:
        strcpy(vysledek,vstup1); // prime pouziti knihovni funkce srtcpy, pozor na poradi argumentu
        break;
    case 5:
        printf("\nZadej retezec ktery se prida na konec:\n> ");
        scanf("%*[^\n]"); scanf("%*c"); // pred zadanim dalsiho textu vycistime standartni vstup
        nactiVstup(vstup2);
        spojRetezce(vstup1, vstup2, vysledek);
        break;
    case 6:
        printf("\nZadej retezec se kterym se prvni porovna:\n> ");
        scanf("%*[^\n]"); scanf("%*c");
        nactiVstup(vstup2);
        porovnejRetezce(vstup1, vstup2, vysledek);
        break;
    case 7:
        printf("\nZadej slovo ktere chcete v retezci vyhledat:\n> ");
        scanf("%*[^\n]"); scanf("%*c");
        scanf("%s",vstup2); // nacteme pouze jedine slovo
        najdiRetezec(vstup1, vstup2, vysledek);
        break;
    default:
        printf("Neznama operace!");
        return -1;
    }

    printf("\n\nVstup1: %s\n", vstup1);
    if(volba > 4) printf("Vstup2: %s\n", vstup2);
    printf("\nVysledek: %s\n", vysledek);
    return 0;
}

void nactiVstup(char *retezec)
{
    //scanf("%s", retezec); // nacte pouze jedno slovo, take si vsimnete ze jsem nepouzil & - to proto, ze 'str' je jiz ukazatel do pameti
    fgets(retezec, STR_MAX, stdin); // alternativni zpusob pro nacteni celeho radku
}

void velkaPismena(char str[], char vysledek[]) // vsimnete si, ze prototyp vypadal: void velkaPismena(char*, char*);
{
    size_t delka = strlen(str);
    for(size_t i = 0; i < delka; i++)
    {
        vysledek[i] = toupper(str[i]);
    }
    vysledek[delka] = '\0'; // nezapomente vzdy ukoncit retezec
}

void malaPismena(char *str, char *vysledek) // tady uz je prototyp zachovan
{
    size_t delka = strlen(str);
    for(size_t i = 0; i < delka; i++)
    {
        vysledek[i] = tolower(str[i]);
    }
    vysledek[delka] = '\0';
}

void obratRetezec(char *str, char *vysledek)
{
    size_t delka = strlen(str);
    for(size_t i = 0, j = delka - 1; i < delka; i++, j--)
    {
        vysledek[i] = str[j];
        //vysledek[i] = str[delka-i-1]; // alternativa pokud nepouzijete druhou promennou
    }
    vysledek[delka] = '\0';
}

void spojRetezce(char *str, char *str2, char *vysledek)
{
    size_t delka = strlen(str);
    strcpy(vysledek,str); // pozor at si neprepisete vstupni retezce
    strcat(vysledek, str2);
}

void porovnejRetezce(char *str, char *str2, char *vysledek)
{
    if(strcmp(str, str2) == 0)
        strcpy(vysledek,"retezce jsou shodne"); // vysledek = "retezce jsou shodne"; nebude fungovat protoze 'vysledek' je ukazatel
    else
        strcpy(vysledek,"retezce jsou rozdilne");
}

void najdiRetezec(char *str, char *str2, char *vysledek)
{
    if(strstr(str, str2) > 0)
        strcpy(vysledek,"retezce obsahuje zadany slovo");
    else
        strcpy(vysledek,"retezce neobsahuje zadane slovo");
}