Problem z funkcją char*

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!

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

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.

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,

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

0

A może tak?

char* YO(char *S1, char *S2){
    S1[1] = S2[0];
    S1[2] = '\0';
    return S1;
}  
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.

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.

0

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

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".

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!

0
YO napisał(a)
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!

Jeśli S1 wskazuje na "ab", a S2 na "cd", to po wykonaniu tej funkcji S1 będzie wskazywało na "ac". Wynik będziesz miał w *S1, a nie w zwrocie funkcji. '\0' to bajt zerowy, którym winny kończyć się cstringi. Tak naprawdę S1 (przed wykonaniem funkcji) wskazuje na {'a', 'b', '\0', śmieci...}, a S2 na {'c', 'd', '\0', śmieci...}. Powyższa funkcja pod indeksem 1 S1 wpisuje zawartość S2[0] (czyli pierwszy znak z *S2), a ponieważ cstring musi być zakończony bajtem zerowym oznaczającym jego koniec, pod S2[2] musisz jeszcze zapisać '\0'.

0

Dzięki rozumiem.

Mam pytanie da się napisać tą funkcje(wnętrze!) tak, żeby po wprowadzeniu abcdefgh ijklmytw zwróciło mi w S=aibjckdlemfygthw
Oczywiście można było by zrobić na podobnej zasadzie co @byku_guzio ale potrzebuję szybszego i sprytniejszego rozwiązania. Kombinowałem z pętelką for, ale coś mi nie wyszło... :/ może ktoś ma pomysł na lepsze rozwiązanie?
YO!

0

Poniżej zamieszczam kod który wykombinowałem... tylko nie wiem dlaczego zwraca mi tylko 2 znaki?

char* YO(char *S1, char *S2){
            char *wynik = new char[(strlen(S1)+strlen(S2))]; 
            bool s=true;
            for(int i=0; i<(strlen(S1)+strlen(S2)); i++){
               if(s==true){
                 wynik[i]=S1[i];
                 s=false;
               }
               else{
                 wynik[i]=S2[i-1];
                 s=true;
               }
            }   
       return wynik;
} 
0

Nie sprawdzałem dokładnie, ale powinno działać

char* YO(char *S1, char *S2)
{
	int longerLength, shorterLength, i, j;
	char *longer, *result;

	if(strlen(S1) > strlen(S2))
	{
		longer = S1;
		longerLength = strlen(S1);
		shorterLength = strlen(S2);
	}
	else
	{
		longer = S2;
		longerLength = strlen(S2);
		shorterLength = strlen(S1);
	}

	result = new char[longerLength + shorterLength + 1];

	i = 0;
	j = 0;
	while(i < shorterLength)
	{
		result[j++] = S1[i];
		result[j++] = S2[i];
		i++;
	}

	while(i < longerLength)
	{
		result[j++] = longer[i++];
	}

	result[j] = '\0';
	return result;
}
0

Dzięki! Funkcja działa poprawnie! Ma może ktoś pomysł na coś szybszego? YO!

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