Pytający nie ma niczego gdzieś, kiedyś pisał w C, ale to było dawno, stąd doskonale wiedział, że to powinno działać, ale zapomniał... Wiem co robiłem źle!
Mój błąd polegał na tym, że próbowałem zmienić coś, czego zmieniać nie powinienem. A rozwiązanie okazało się bardzo proste. Memcpy też nie działało, bo próbowałem przypisać wartość w tej funkcji, kiedy tak naprawdę powinienem podać wskaźnik do już istniejącej funkcji. Więc zrobiłem to następująco:
char n = '\0';
memcpy(&a[b-a],&n,1);
Całość działa, a kod wygląda następująco:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *s;
int s_count;
char* LineToStrTest(char *in_s, int in_l, char *separator){
return "test";
}
char* LineToStr(char *in_s, int in_l, char *separator){
int i = strlen(in_s)+1;
if (s_count==0){
s_count = i;
s = malloc(s_count);
} else {
if (s_count<i){
free(s);
s_count = i;
s = malloc(s_count);
}
}
strcpy(s,in_s);
char *a = s;
char *b = s;
char n = '\0';
/* usuwam segmenty niepotrzebne przed */
for (i=2;i<=in_l;i++){
if (a){
a=strstr(a,separator);
if (a) a++;
} else break;
}
/* usuwam segmenty niepotrzebne po */
if (a) {
if (b=strstr(a,separator)){
memcpy(&a[b-a],&n,1);
}
} else return "";
printf("a=%s\n",a);
return a;
}
void __attribute__ ((constructor)) my_init(void) {
s_count = 0;
}
void __attribute__ ((destructor)) my_fini(void) {
if (s_count>0)
{
free(s);
s_count = 0;
}
}
/*
void main()
{
printf("Wynik=%s\n",LineToStr("1;2;3;4;5",3,";"));
}
*/
A teraz co chciałem osiągnąć? Chciałem napisać kawałek biblioteki, w której po podaniu ciągu ograniczonego stałym separatorem, kod wyciągnie mi z niego żądany n-ty element, biorąc pod uwagę warunek, by elementy ujęte w apostrofach były brane całkowicie niezależnie od tego, czy wewnątrz nich były by użyte znaki separatora. Kod nie został skończony, bo próbowałem rozwiązać problem, który mi wskoczył... poza tym okazało się, że ten kod wykonuje się o wiele dłużej, niż ten sam kod napisany pod Lazarusem, myślałem, że odpowiednia funkcja w C przyśpieszy mi działanie tego kodu w pewnym programie, gdzie używam tego dosyć sporo... Jednak kod w Pascalu działa mi o wiele szybciej. Wywołanie takiej pustej funkcji to powoła czasu działaniu mojej w pascalu... Gdyby udało mi się to napisać tak by wykonywało się choć 2 razy szybciej, to byłby sens to dokończyć. Ale takie właśnie były założenia. Pewnie można było by ten kod jeszcze zoptymalizować i pozbyć się niepotrzebnych if-ów, pewnie się tym jeszcze pobawię, bo mnie ciekawość zżera. Dzięki za pomoc, dalej poradzę sobie już sam. Pozdro!