Coś się douczyłem i chyba już rozumiem....Tutaj tablica jest dynamiczna z nazwy ale chodzi o dynamiczne alokowanie pamięci.
Jeśli chcielibyśmy użyć "tablicy" którą możemy dynamicznie powiększać musimy użyć kontenera np vector?
I jeszcze jedno pytanie - co nam te char* string_merge(char* s1, char* s2) wskaźniki dają ? Przecież nie korzystamy tutaj z referencji. ani nie pracujemy na wskaźnikach już w środku funkcji?
Witam mam problem z zadaniem. Jak wpisuje a bb lub afr der to na końcu mam śmieci. Ale jak wpisze wqeqweqweq eqweqwe to już wszystko gra. Domyślam się że gdzieś mam błąd z rozmiarami tablic ale nie wiem gdzie i zastanawiam się czy nie dodać jakiegoś if który za zadanie miałby by sprawdzić jak duża jest tablica i wtedy manipulowałby rozmiarem tablicy.
http://ideone.com/viEpa437
Linijka 34:
popraw na:
char* text_final2 = new char[size_tab_final + 1];
Dodaj przed returnem:
text_final2[size_tab_final] = '\0';
Po tym będzie AC.
Tylko tak się zastanawiam po co męczyć się ze wskaźnikami skoro możesz użyć obiektu string? Na przyszłość zajrzyj do biblioteki standardowej. Znajdziesz tam wiele przydatnych gotowych klas i algorytmów.
Cześć! Czy ja też mogę zadać pytanie do tego zadania? To moje pierwsze dni na SPOJu i gdzieś przeczytałam, że sędzia sprawdza input i output zadania. Czy zatem mogę się nie do końca zastosować do treści? W poniższym nie ma char* i nie ma wskaźnika do tablicy alokowanej dynamicznie, czy zatem jest to powód do "błędnej odpowiedzi"?
include
include
using namespace std;
int t;
string StringMerge(string S1,string S2)
{
int n=min(S1.length(),S2.length());
string napis;
int j=0;
while(n>0)
{
napis=napis+S1.substr(j,1)+S2.substr(j,1);
n--;
j++;
}
napis+='\0';
return napis;
}
int main()
{
cin >> t;
string S1,S2;
do
{
cin>> S1>>S2;
cout << StringMerge(S1,S2);
t--;
}while (t>0);
return 0;
}
kod jest jaki jest, dopiero zaczynam, proszę o wyrozumiałość
Tak, sędzia nie sprawdza czy masz funkcję dokładnie taką jak w treści zadania. Interesuje go tylko czy odpowiedź jest poprawna. Więc nie to jest powodem błędnej odpowiedzi.
Sprawdź sobie różnice pomiędzy stringami, a C-stringami w języku C++. Robisz ze stringiem coś, co nie jest wymagane przy pracy z nim, a z kolei sędzia tego nie toleruje.
Następna rzecz, to Twoje wyjście jest nie do końca takie samo, jak wymagane.
Jeśli to poprawisz, to pojawi się AC na zielonym tle, co Cię z pewnością ucieszy
Jeśli chodzi o różnicę między C-string a string to domyśliłam się, że niepotrzebnie robie +'\0'.
'Twoje wyjście jest nie do końca takie samo, jak wymagane'
a tutaj czy masz na myśli to że nie mam najpierw bloku in a dopiero potem bloku out? Tu też gdzieś przeczytałam, że nie musi tak być, że sędzia sam rozpoznaje co jest in a co out. Ale może robię błąd w sklejaniu?
Tak, stringi nie kończą się terminatorem i jeśli go tam dodasz, to przy wypisywaniu ten znak również zostanie wypisany, inaczej niż przy wypisywaniu C-stringa.
Za dużo kombinujesz. W treści zadania czytamy: "Output: W każdej linii jeden łańcuch". W domyśle: jedna linia wyjścia na jeden test. U Ciebie wszystko jest wypisywane w tej samej linii. Dodaj endl po wypisaniu stringa i sędzia będzie zadowolony.
Witam. Dopiero zacząłem się uczyć C++, więc wielu rzeczy jeszcze nie rozumiem. W moim kompilatorze program działa bez problemu, ale SPOJ go nie akceptuje. Pojawia mi się błąd wykonania (SIGSEGV). Nie bardzo wiem, o co chodzi. W którym miejscu zrobiłem błąd? Poniżej mój kod:
#include <iostream>
using namespace std;
void f(string a1, string b1);
int main()
{
int ile;
cin>>ile;
for(int i=0;i<ile;i++)
{
string a,b;
cin>>a>>b;
f(a,b);
}
return 0;
}
void f(string a1,string b1)
{
int dl_a=a1.length();
int dl_b=b1.length();
if(dl_a<dl_b)
{
int ii=0;
char wynik[dl_a*2];
for(int i=0;i<dl_a;i++)
{
wynik[ii]=a1[i];
wynik[ii+1]=b1[i];
ii=ii+2;
}
wynik[dl_a*2]='\0';
cout<<wynik<<endl;
}
else
{
int ii=0;
char wynik[dl_b*2];
for(int i=0;i<dl_b;i++)
{
wynik[ii]=a1[i];
wynik[ii+1]=b1[i];
ii=ii+2;
}
wynik[dl_b*2]='\0';
cout<<wynik<<endl;
}
}
Będę wdzięczny za każdą pomoc
w twoim przypadku, SIGSEGV oznacza błąd przy próbie zapisu do nieistniejącego elementu tablicy - sam poszukaj, gdzie to robisz
i po co ci dwa prawie takie same fragmenty kodu w funkcji f() ? - przecież wystarczy dać na początku:
if (dl_a >dl_b)
dl_a = dl_b;
a kod będzie krótszy i będzie wyglądał dużo ładniej