Wątek przeniesiony 2017-07-03 08:15 z C/C++ przez ŁF.

Funkcja zamieniająca litery małe na duże i na odwrót

0

Witam, chciałem prosić o pomoc.
Polecenie brzmi: napisz funkcję, która przyjmie 3 parametry: tablicę znakową lan, oraz dwa wskaźniki lz i ld. Funkcja ma za zadanie zmienić wielkie litery na małe i na odwrót. Funkcja bezpośrednio nie zwraca nic, a przez wskaźnik zwraca ilość zmian z dużych na małe i na odwrót.
Następnie napisać program, który ma wczytać n, które będzie większa od 1, zarezerwować pamięć dla tablicy znaków o podanym w n rozmiarze. Podać znak po znaku zawartość tablicy, a następnie wykorzystać utworzona wyżej funkcje po czym wyświetlić tablicę po modyfikacji, zmiany na wielkie litery i zmiany na małe litery.

Aktualnie napisałem taki kod, ale mam problem z funkcją modyfikuj. Program działa, ale do momentu działania tej funkcji. Program się wysypuje przy jej działaniu

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

void modyfikuj(char* lan, int* ld, int* lm)
{
    int i;
    *ld = 0;
    *lm = 0;
    for (i = 0; i < (sizeof(lan) / sizeof(char)); i++)
        ;
    {
        if ((*(lan + i) <= 'z' && *(lan + i) >= 'a')) {
            *(lan + i) = toupper(*(lan + i)); //zamieniam na duze litery
            *ld = *ld + 1;
        }

        if ((*(lan) + i <= 'Z' && *(lan) + i >= 'A')) {
            *(lan + i) = tolower(*(lan + i));
            *lm = *lm + 1;
        }
    }
}

int main()
{
    int n, i, *dz = 0, *mz = 0;
    char* tab;
    do {
        printf("podaj n\n");
        scanf("%d", &n);

    } while (n < 1);

    tab = (char*)calloc(n, sizeof(char));
    for (i = 0; i < n; i++) {
        printf("podaj %d element tablicy: ", i);
        scanf("%s", (tab + i));
    }
    for (i = 0; i < n; i++) {
        printf(" %d element tablicy: %c\n", i, *(tab + i));
    }
    modyfikuj(*tab, dz, mz);
    return 0;
}

Bardzo proszę o pomoc, i z góry dziękuję za odpowiedzi.
Ps. Przepraszam za błędy techniczne, to mój pierwszy post :P

1
  1. masz średnik po forze
  2. modyfikuj(*tab, dz, mz); - *tab to znak, dz i mz to null pointery. W modyfikuj oczekujesz czegoś zupełnie innego
  3. zamiast hardkodować warunki, użyj islower/isupper.
  4. dowolny kurs C polecam, dział ze wskaźnikami.
  5. *(lan + i)lan[i]
  6. *(lan) + i <= 'Z' ⟵ nie ma sensu

Tyle na szybko

0

Poprawiłem kod

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

void modyfikuj(char* lan, int* ld, int* lm)
{
    int i;
    *ld = 0;
    *lm = 0;
    for (i = 0; i < (sizeof(lan) / sizeof(char)); i++)
    {
        if (islower(lan[i]))
            {
            lan[i] = toupper(lan[i]);
            *ld = *ld + 1;
            }
        else
        {
            if (isupper(lan[i]))
                {
                lan[i] = tolower(lan[i]);
                *lm = *lm + 1;
                }
        }
    }
}
int main()
{
    int n, i, dz, mz;
    char* tab;
    do {
        printf("podaj n\n");
        scanf("%d", &n);

    } while (n < 1);

    tab = (char*)calloc(n, sizeof(char));
    for (i = 0; i < n; i++) {
        printf("podaj %d element tablicy: ", i);
        scanf("%s", (tab + i));
    }
    for (i = 0; i < n; i++) {
        printf(" %d element tablicy: %c\n", i, *(tab + i));
    }
    modyfikuj(tab, &dz, &mz);
    for (i = 0; i < n; i++) {
        printf(" %d element tablicy po modyfikacji: %c\n", i, tab[i]);
    }
    printf(" zamiana na wielkie: %d ", dz);
    printf(" zamiana na male: %d ", mz);

    return 0;
}

Śmiga, dzięki wielkie :D

0

Nie działa :-P

  1. Jeśli przekazujesz tablicę do funkcji przez wskaźnik, to w ten sposób (sizeof(lan) / sizeof(char)) nie sprawdzasz jej rozmiaru. Wymagane jest podanie jej rozmiaru w parametrze, chyba, że: parametrem jest wskaźnik na łańcuch znakowy, wtedy można użyć: i < strlen(lan);
  2. To nie błąd, ale zamiast pisać: *ld = *ld + 1, można napisać: *ld++

1 użytkowników online, w tym zalogowanych: 0, gości: 1