Problem z funkcją char*

Odpowiedz Nowy wątek
2011-07-10 20:45
YO
0
#include <iostream>
using namespace std;
#define T_SIZE 1001
char* YO(char *, char *);
 
int main(){
  char S1[T_SIZE], S2[T_SIZE], *S;
 
    cin.getline(S1,T_SIZE,' ');
    cin.getline(S2,T_SIZE);      
 
    S=YO(S1,S2);
    cout<<S; 
    return 0; 
}
 
char* YO(char *S1, char *S2){
                 return S1[0]+S2[0];
} 

Problem w tym, że chcę zwrócić pierwszy znak z S1 i S2, i nie mam pomysłu jak to zrobić? :/ Dodam, że w kodzie nie można nic zmieniać oprócz wnętrza funkcji char YO(char , char *).
Może ktoś ma pomysła?
YO!

Pozostało 580 znaków

2011-07-10 20:48
0
char* YO(char *S1, char *S2)
{
    char *wynik = new char[3];
    wynik[0] = S1[0];
    wynik[1] = S2[0];
    wynik[2] = '\0';
 
    return wynik;
}

Aczkolwiek nie będzie to do końca poprawne - wyciek pamięci


edytowany 1x, ostatnio: byku_guzio, 2011-07-10 20:49

Pozostało 580 znaków

2011-07-10 21:06
Kumashiro
0
YO napisał(a)
char* YO(char *S1, char *S2){
return S1[0]+S2[0];
} 

Tak się nie konkatenuje cstringów! To nie Java, czy PHP! W tym kodzie "return" zwraca Ci sumę wartości adresów zapisanych w przekazywanych wskaźnikach, a raczej nie o to Ci chodzi, bo w ten sposób albo zwracasz wskaźnik do obszaru pamięci nieprzydzielonego dla Ciebie i/lub poza rozmiar dostępnej pamięci albo wskaźnik do obszaru pamięci przechowujący inne dane Twojego programu (jeśli alokujesz dużo pamięci i masz dużo RAMu).

YO napisał(a)

Problem w tym, że chcę zwrócić pierwszy znak z S1 i S2, i nie mam pomysłu jak to zrobić? :/ Dodam, że w kodzie nie można nic zmieniać oprócz wnętrza funkcji char YO(char , char *).
Może ktoś ma pomysła?
YO!

Jeśli chcesz zwrócić wskaźnik do cstringa będącego konkatenacją dwóch innych, użyj funkcji strcat(), lub ręcznie kopiuj (malloc()/calloc() + strlen() + memcpy()/strcpy() + jakaś pętla). Pamiętaj o konieczności zwalniania pamięci.

Pozostało 580 znaków

2011-07-10 21:10
Kumashiro
0

...albo wykorzystaj propozycję byku_guzio. Zazwyczaj jednak w takich przypadkach do funkcji konkatenującej przekazuje się wskaźnik do bufora (+jego rozmiar), w którym ma być umieszczony wynik. W ten sposób alokujesz pamięć "poziom wyżej", gdzie najczęściej siedzi cała logika alokacji i zwalniania pamięci,

Pozostało 580 znaków

2011-07-10 21:12
Kumashiro
0
Kumashiro napisał(a)

W tym kodzie "return" zwraca Ci sumę wartości adresów zapisanych w przekazywanych wskaźnikach

Autokorekta: zwraca Ci sumę char + char. Sorry, zignorowałem indeksację :D

Pozostało 580 znaków

2011-07-10 21:21
Spect
0

A może tak?

char* YO(char *S1, char *S2){
    S1[1] = S2[0];
    S1[2] = '\0';
    return S1;
}  

Pozostało 580 znaków

2011-07-10 22:11
Kumashiro
0
Spect napisał(a)

A może tak?

char* YO(char *S1, char *S2){
S1[1] = S2[0];
S1[2] = '\0';
return S1;
}  

Ryzykowne. W ten sposób zakładasz, że tablica wskazywana przez S1 będzie miała rozmiar conajmniej 3, a nie musi to być prawdą. W kodzie wątkotwórcy to jest prawdą, ale funkcja nigdy nie powinna ufać, że zawsze dostanie S1 o wystarczającej pojemności, chyba że w dokumentacji będzie BIG FAT WARNING, ale to nieeleganckie.

Pozostało 580 znaków

2011-07-10 22:22
0
Spect napisał(a)

A może tak?

char* YO(char *S1, char *S2){
S1[1] = S2[0];
S1[2] = '\0';
return S1;
}  

Zmieniasz S1 co nie koniecznie jest w założeniu.

Pozostało 580 znaków

2011-07-10 22:23
0

I dodatkowo zmieniasz przy okazji zawartość tablicy S1, a to jest raczej niepożądane działanie.


Pozostało 580 znaków

2011-07-10 22:25
Kumashiro
0
byku_guzio napisał(a)

I dodatkowo zmieniasz przy okazji zawartość tablicy S1, a to jest raczej niepożądane działanie.

To w takim razie w protoypie powinno być "const char *S1".

Pozostało 580 znaków

2011-07-10 23:11
YO
0
Spect napisał(a)

A może tak?

char* YO(char *S1, char *S2){
S1[1] = S2[0];
S1[2] = '\0';
return S1;
}  

Dzięki Panowie! Jeszcze jedna prośba mógby ktoś w prosty sposób wytłumaczyć o co chodzi w tej funkcji:
Weźby przykład ab cd - to wtedy S1[1]==c, S1[2]==? i tutaj nie wiem co oznacza '\0'? i jak to się dzieje, że zwraca ac skoro a nie zostało do niczego przypisane?
YO!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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