char* string_cut(char *text, int begin, int end)
{
char phrase[end - begin];
int index = 0;
for (int i = begin; i < end; ++i)
{
phrase[index++] = text[i];
}
return phrase;
}
Funkcja wycina z textu fraze, pomiedzy znakami o pozycjach begin i end, np.
0 1 2 3 4 5 6 7 8 9
k o t p i e s r y b a
wycinam miedzy 2 a 7 -> string_cut(text, 2, 7) ; -> wynik poniżej
3 4 5 6
p i e s
a zwraca krzaczki, gdzie są błedy?
Zulowski
(Zulowski)
7 Lipiec 2015 18:23
#2
char* string_cut(char *text, int begin, int end);
void main()
{
char *xx = string_cut("kotpiesryba", 3, 7);
}
char* string_cut(char *text, int begin, int end)
{
char *phrase = new char[end - begin +1];
int index = 0;
for (int i = begin; i end; ++i)
{
phrase[index++] = text[i];
}
phrase[index] = '\0';
return phrase;
}
Tylko że program jest w C, a nie w C++, czyli odpada operator new/delete …
Zulowski
(Zulowski)
7 Lipiec 2015 18:45
#4
musisz użyć w takim razie malloc z 7=3 * sizeof(char)
nie stworzysz sobie w taki sposob jak pisales tablicy dynamicznie ;p
nie pisalem nic w C i c++ od x lat…
koniec tekstu zaznaczasz \0
nintyfan
(nintyfan)
7 Lipiec 2015 18:52
#5
Istnieje funkcja strndup. Jeżeli nie robisz tej funkcji dla zabawy, to możesz skorzystać ze strndup.
strdup() czy malloc/free --> da sie zastąpić new/delete czyli
char* string_cut(char *text, int begin, int end)
{
char *phrase = malloc((end - begin + 1)*sizeof char);
int index = 0;
for (int i = begin; i < end; ++i)
{
phrase[index++] = text[i];
}
phrase[index] = '\0';
return phrase;
}
zadziała?
naprawiłem już. działa.
#include <stdio.h>
int main(int argc, char *argv[])
{
char* string_cut(char *text, int begin, int end)
{
char *phrase = malloc((end - begin)*sizeof(char));
int index = 0;
for (int i = begin; i < end; ++i)
{
phrase[index++] = text[i];
}
phrase[index] = '\0';
return phrase;
}
char *xx = string_cut("kotpiesryba", 3, 7);
printf("%s\n", xx);
return 0;
}
ale nie tak jak ma …
char* string_cut(char *text, int begin, int end)
{
char *phrase = malloc((end - begin)*sizeof(char));
int index = 0;
for (int i = begin; i < end; ++i)
{
phrase[index++] = text[i];
}
phrase[index] = '\0';
return phrase;
}
char *xx = string_cut("123456789", 5, 7);
printf("%s\n", xx);
ma zwracac tylko to co pomiedzy, bez “krawedzi”
czyli jak mamy 5 i 7 to wynik ma byc 6 a jest 67
jak to naprawić?
Jeśli chcesz to zrobić prościej to nie baw się w osobną funkcję tylko skorzystaj z: char* strncpy(char* dest, char* src, int n)
char phrase[end - begin + 1];
strncpy(phrase, text+begin, end-begin);
mikolaj_s
(mikolaj_s)
10 Lipiec 2015 13:01
#10
Ad1. Nie o strncpy tylko strndup
Ad2. Ale może nie musi jeśli tablica nie zmieni zasięgu i nie będzie duża, zawsze też można ją wcześniej zaalokować podałem tylko przykład, nikt nie musi z niego skorzystać dosłownie.
fedora24x
(fedora24x)
11 Lipiec 2015 19:24
#11
char* string_explode(char *text, char delimiter)
{
int lenght = string_lenght(text);
char **array = (char**)malloc(lenght * sizeof (*array));
int indexs[lenght];
int index = 0;
for (int a=0; i<lenght; i++)
{
if(text[a] == delimiter)
{
indexs[index] = a;
index = index + 1;
}
int b = 0;
for (int c=0; c<string_lenght(indexs); c++)
{
if(c == 0)
{
int difference = indexs[c];
char *phrase = malloc(difference);
*phrase = string_cut(text, 0, index[0]);
} else {
int difference = indexs[c] - indexs[c-1];
char *phrase = malloc(difference);
*phrase = string_cut(text, index[c], index[a-1]);
}
array[b] = *phrase;
}
return *array;
}
Tą funkcje potrzebuje do tego, ale ta funkcja też sie sypie, gdzieś na wskażnikach
Rower1985
(Ostaszewianin)
11 Lipiec 2015 21:23
#12
fedora24x:
char* string_explode(char *text, char delimiter) { int lenght = string_lenght(text); char **array = (char **)malloc(lenght * sizeof (*array)); int indexs[lenght]; int index = 0; for (int a=0; i<lenght; i++) { if(text[a] == delimiter) { indexs[index] = a; index = index + 1; } int b = 0; for (int c=0; c<string_lenght(indexs); c++) { if(c == 0) { int difference = indexs[c]; char *phrase = malloc(difference); *phrase = string_cut(text, 0, index[0]); } else { int difference = indexs[c] - indexs[c-1]; char *phrase = malloc(difference); *phrase = string_cut(text, index[c], index[a-1]); } array[b] = *phrase; } return *array; } Tą funkcje potrzebuje do tego, ale ta funkcja też sie sypie, gdzieś na wskażnikach
Proszę, używaj google - ta funkcja jest na 1 miejscu po wpisaniu zapytania. Wiesz co to debugger?Nie licz na to, że ktoś odbębni za Ciebie kod.
nintyfan
(nintyfan)
12 Lipiec 2015 06:46
#13
Ja bym użył rzutowania char* na intptr, by obliczyć długość stringu i jakiejś funkcji kopiującej pamięć. Możesz jednak użyć od razu strndup lub strncpy(tak mi się przynajmniej wydaje).
Mnie uczono programować bez dostępu do komputera(jeden komputer w rodzinie) - i dało to dobre efekty, bo najważniejsze, to nauczyć się myśleć w odpowiedni sposób.
fedora24x
(fedora24x)
12 Lipiec 2015 15:09
#14
Wiem, widziałem już przedtem ta funkcje na stackoverflows i nie tylko, ale pod projekt potrzeba swojej implentancji, tak abym wiedział jak działa.
Ale nie wiem czy dobrze alokuje pamięć i czy dobrze się do niej odwołuje?
Rower1985
(Ostaszewianin)
13 Lipiec 2015 08:57
#15
Na której lini się sypie?