• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Poprawność kodu

Object Storage Arubacloud
0 głosów
201 wizyt
pytanie zadane 24 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
zamknięte 25 kwietnia 2020 przez ResCrove
#include <stdio.h>

char* change_letter_size(char* dest, const char* src)
{
    int i = 0;
    if(dest == NULL || src == NULL)
    {
        return NULL;
    }
    while(*(src + i) != '\0')
    {
        if((*(src + i) >= 'a') && (*(src + i) <= 'z'))
        {
            *(dest + i) = *(src + i) - 32; 
        }
        else if((*(src + i) >= 'A') && (*(src + i) <= 'Z'))
        {
            *(dest + i) = *(src + i) + 32; 
        }
        else
        {
            *(dest + i) = *(src + i);
        }
        i++;        
    }
    return dest;
}

int main()
{
    char tab1[1000] = {0};
    char tab2[1000] = {0};
    char *wtab2 = tab2;

    printf("Podaj tekst: ");
    scanf("%1000[^\n]", tab1);
    printf("%s", change_letter_size(wtab2, tab1));

    return 0;
}

Oto program zamieniający małe litery w tekście na duże a duże na małe. Czy ktoś mógłby ocenić poprawność kodu i doradzić co poprawić?

komentarz zamknięcia: Podana odpowiedź

2 odpowiedzi

+1 głos
odpowiedź 25 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
wybrane 25 kwietnia 2020 przez ResCrove
 
Najlepsza
#include <stdio.h>

char* change_letter_size(char* dest, const char* src)
{
    if ((NULL == dest) || (NULL == src))
    {
        return NULL;
    }
    char * ptr_dest = dest;
    while ((*ptr_dest = *src))
    {
        if ((('a' <= (*src)) && ('z' >= (*src)))
            || (('A' <= (*src)) && ('Z' >= (*src))))
        {
            *ptr_dest ^= 0x20;
        }
        ++src;
        ++ptr_dest;
    }
    return dest;
}

int main(void)
{
    char tab1[1000] = {0};
    char tab2[1000] = {0};

    printf("Podaj tekst: ");
    scanf("%1000[^\n]", tab1);
    printf("%s", change_letter_size(tab2, tab1));

    return 0;
}

Ten scanf(...) także lepiej zmienić na coś innego bo masz magiczną stałą 1000. Np. gets(...)

komentarz 25 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)
*ptr_dest ^= 0x20;

Co oznacza ta linijka kodu?

1
komentarz 25 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
To jest XOR. Zapalasz lub gasisz 1 bit o wartości 32 w zależności od tego czy bajt jest literą. Jak zerkniesz do tablicy wartości ASCII, to zorientujesz się że duża litera i mała, różnią się tylko tym 1 bitem.
+1 głos
odpowiedź 25 kwietnia 2020 przez Kapa Początkujący (380 p.)
Mi wygląda wszystko dobrze. Nie rozumiem tylko przypisania "char *wtab2 = tab2;" dlaczego w change_letter_size nie podać poprostu tab2?

Podobne pytania

0 głosów
1 odpowiedź 175 wizyt
pytanie zadane 15 grudnia 2019 w C i C++ przez user124 Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 108 wizyt
pytanie zadane 12 października 2018 w SPOJ przez Jason_Nr_1 Bywalec (2,980 p.)
+1 głos
2 odpowiedzi 577 wizyt
pytanie zadane 13 lutego 2023 w C i C++ przez Saskus Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...