Pronađi i zameni parove karaktera

Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>

Napisati program koji pronalazi u stringu parove zadatih karaktera i menja im mesta. Program traži od korisnika da unese string maksimalne dužine 100 karaktera, koji se može sastojati od više reči, zatim dva karaktera. Uneti karakteri moraju biti isključivo mala slova.

Potrebno je proći kroz string, pronaći prvi karakter, zatim u ostatku stringa pronaći prvu pojavu drugog karaktera. Ukoliko ona postoji, potrebno je izvršiti zamenu njihovih mesta u stringu. Zamena se vrši bez obzira na veličinu slova. Zamenjena slova uzimaju veličinu originalnog slova na toj poziciji. Ukoliko je originalno slovo bilo veliko, zamenjeno slovo postaće veliko, iako je na originalnoj poziciji bilo malo i obrnuto (pogledati primere). Ako dođe do situacije da prvi karakter nema odgovarajući drugi karakter sa kojim bi se zamenio, ispisati sledeći tekst: Ne postoji odgovarajuci broj parova za znakove <znak1> i <znak2>!\n. U suprotnom slučaju, kada drugog znaka ima više od prvog i kada i jednog i drugog ima tačno koliko treba, ne ispisivati navedenu poruku.

Na standardnom izlazu (ekranu terminala) ispisati string nakon izmene.

Primer rada programa:

Primer rada programa u slučaju jednostavne zamene, oba slova mala:

Uneti string: mama ima macku
Uneti prvi znak: m
Uneti drugi znak: a
String nakon zamene znakova m i a: amam iam amcku

Primer rada programa u slučaju zamene uz različite veličine slova:

Uneti string: Mama ima malu Maru
Uneti prvi znak: m
Uneti drugi znak: a
String nakon zamene znakova m i a: Amam iam amlu Amru

Primer rada programa u slučaju kada string ima jedan prvi karakter, a više pojava drugog karaktera:

Uneti string: robotika
Uneti prvi znak: r
Uneti drugi znak: o
String nakon zamene znakova r i o: orbotika

Primer rada programa u slučaju da nema dovoljno parova unesenih karaktera:

Uneti string: mama ima metlu
Uneti prvi znak: m
Uneti drugi znak: a
Ne postoji odgovarajuci broj parova za znakove m i a!
String nakon zamene znakova m i a: amam iam metlu

Primer rada programa u slučaju kada su u stringu prvi i drugi karakter u pogrešnom redosledu:

Uneti string: bbbaaa
Uneti prvi znak: a
Uneti drugi znak: b
Ne postoji odgovarajuci broj parova za znakove a i b!
String nakon zamene znakova a i b: bbbaaa

Primer rešenja

 1#include <stdio.h>
 2#include <stdio_ext.h>
 3#include <ctype.h>
 4#include <string.h>
 5
 6#define MAX_STR 101
 7
 8int main() {
 9    char str[MAX_STR];
10    char prvi, drugi;
11
12    printf("Uneti string: ");
13    
14    fgets(str, MAX_STR, stdin);
15    int duzina_str = strlen(str);
16    if (str[duzina_str - 1] == '\n') {
17        str[duzina_str - 1] = '\0';
18    }
19
20    do
21    {
22        printf("Uneti prvi znak: ");
23        scanf("%c", &prvi);
24        __fpurge(stdin);
25    } while(prvi < 'a' || prvi > 'z');
26
27    do
28    {
29        printf("Uneti drugi znak: ");
30        scanf("%c", &drugi);
31        __fpurge(stdin);
32    } while(drugi < 'a' || drugi > 'z');
33
34    char *s = str, *t, tmp;
35    int zamena;
36
37    while (*s != '\0') {
38        zamena = 0;
39
40        if (tolower(*s) == prvi) {
41            t = s + 1;
42            while (*t != '\0') {
43                if (tolower(*t) == drugi) {
44                    if (isupper(*s) && islower(*t))
45                    {
46                        *s = tolower(*s);
47                        *t = toupper(*t);
48                    }
49                    else if (islower(*s) && isupper(*t))
50                    {
51                        *s = toupper(*s);
52                        *t = tolower(*t);
53                    }
54
55                    tmp = *s;
56                    *s = *t;
57                    *t = tmp;
58
59                    s = t;
60                    zamena = 1;
61                    break;
62                }
63
64                t++;
65            }
66
67            if(zamena == 0) {
68                printf("Ne postoji odgovarajuci broj parova za znakove %c i %c!\n", prvi, drugi);
69                break;
70            }
71
72        }
73
74        s++;
75    }
76
77    printf("String nakon zamene znakova %c i %c: ", prvi, drugi);
78    puts(str);
79
80
81    return 0;
82}