Funkcja która wycina text w C


(fedora24x) #1
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) #2

kotpiesryba.png

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;
}

(fedora24x) #3

Tylko że program jest w C, a nie w C++, czyli odpada operator new/delete …


(Zulowski) #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) #5

Istnieje funkcja strndup.  Jeżeli nie robisz tej funkcji dla zabawy, to możesz skorzystać ze strndup.


(fedora24x) #6

 

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ć?


(enedil) #7

http://stackoverflow.com/questions/4214314/get-a-substring-of-a-char


(mikolaj_s) #8

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);

(nintyfan) #9

Bez obrazy, ale:

  1. Ja wspomniałem o strncpy

  2. Twój przykład nie alokuje pamięci na stercie, a na stosie


(mikolaj_s) #10

Ad1. Nie o strncpy tylko strndup :wink:

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) #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


(Ostaszewianin) #12

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) #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) #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?


(Ostaszewianin) #15

Na której lini się sypie?