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

Wskaźniki, tablice, zamiana małych liter na duże

42 Warsaw Coding Academy
0 głosów
1,386 wizyt
pytanie zadane 24 stycznia 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)
edycja 24 stycznia 2017 przez Jedyn

Witam. Mam napisać funkcję która jako parametr dostaje wskaźnik do zmiennej typu char (pierwszy element tablicy), znak NULL oznacza koniec ciągu znaków. Zadaniem tej funkcji jest konwersja małych liter na wielkie (inne znaki pozostają bez zmian).

Napisałem coś takiego: 

 

using namespace std;
char funkcja(char *wsk)
{
	for (int i = 0; i < 6, *wsk != '0'; i++, *wsk++)
	{
		cout << toupper(*wsk) << " ";
	}
	
	return *wsk;
}



int main() {

	
	char tab[6] = {'a','b','c','D','0','0'};
	char *wskk;
	wskk = &tab[0];
	cout << funkcja(wskk) << endl;
	cout << toupper('b');
	


	char k;
	cin >> k;

	return 0;
}

Rozumiem ,że jak argumentem ma być wskaźnik to nie możemy podać np tab? Najpierw trzeba stworzyć wskaźnik, przypisać do niego tab i dopiero dać jako argument?
A głowny problem polega na tym, że chciałbym wyświetlić duże litery a nie kod ASCII.

EDIT. Już wiem, zrzutowałem (char)toupper(*wsk) i wszystko działa ale zostawiam pytanie bo może istnieje jakaś inna metoda bez konieczności rzutowania?

komentarz 28 kwietnia 2022 przez Oscar Nałogowiec (29,360 p.)
edycja 28 kwietnia 2022 przez Oscar

Znak o kodzie 0 w ASCII nazywa się NUL.

A wracając do kodu - nie bardzo rozumiem po co tam jest zmienna i w pętli. Przecież nie jest nigdzie używana. W pętli for można dać puste wyrażenia

for ( ; *wsk ; wsk++)

Funkcja toupper zwraca wynik typu int - stąd operator << wypisuje liczby a nie znaki. Możnaby zrzutować na char, ale przecież ta funkcja nie ma wypisywać napisu a dokonać jego konwersji - zamienić w napisie literki małe na wielkie.

void str2upper(char *wsk)
{
    for ( ; *wsk ; wsk++)
    {
        *wsk = (char)toupper(*wsk);
    }
}

No i jeszcze przydałoby się zabezpieczenie przez podaniem NULL jako argument.

Inne uwagi już są w pozostałych wpisach.

 

PS. I jeszcze coś.

Taka deklaracja nie tworzy napisu w stylu C:

    char tab[6] = {'a','b','c','D','0','0'};

Bo brakuje kodu 0 kończącego napis.

Lepiej będzie tak:

    char tab[] = "abcD00";

Z tym, że teraz sizeof(tab) wynosi 7.

2 odpowiedzi

+1 głos
odpowiedź 24 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)
Mozesz przekazać tab jako argument bo odpowiada ona wskaźnikowi na tą tablice. Jeśli chcesz wyświetlić duże litery po prostu zrzutuj na char()
+1 głos
odpowiedź 24 stycznia 2017 przez bartolinciu Dyskutant (7,580 p.)

1. W funkcji funkcja() pętlę fo można uprościć:

size_t length = strlen(wsk);
for( size_t i = 0; i < length ; i++ ){
cout << ( char ) toupper( wsk[i] ) << " ";
}

strlen jest bodajże z biblioteki cstring

2. '0' nie oznacza znaku NULL on oznacza dokładnie znak 0 czyli kod ascii 48 znak null zapisuje się '\0' i w tablicy ascii ma on kod 0

Podobne pytania

0 głosów
1 odpowiedź 2,593 wizyt
pytanie zadane 27 kwietnia 2015 w C i C++ przez andrzejugdziejestes Początkujący (390 p.)
0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 11 grudnia 2024 w C i C++ przez adam234345 Początkujący (400 p.)
0 głosów
1 odpowiedź 1,951 wizyt

93,383 zapytań

142,383 odpowiedzi

322,539 komentarzy

62,745 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...