Realloc, tablica wskaźników [wprowadzanie wyrazów do podania słowa klucz, wyświetlenie najdłuższego słowa]

0

Mam dwa problemy z poniższym kodem.

Po pierwsze, kiedy chcę wypisać słowa wypisuje się po prostu wielokrotnie słowo przerywające pętlę, w tym wypadku 'stop'. Podejrzewam, że problem leży gdzieś w okolicy użycia funkcji realloc, ale niestety absolutnie nie potrafię sama znaleźć błędu. Czy mógłby ktoś wytłumaczyć co tu się wydarzyło?

Kolejna sprawa - program ma za zadanie wyświetlić wszystkie wpisane słowa oraz najdłuższe z nich, ale kiedy dodam linijkę "if(strlen(input)>strlen(longest) w pętli zaraz pod pobraniem wartości to pętla zatrzymuje się po jednym wykonaniu. Jak poprawnie zabrać się za szukanie najdłuższego wyrazu?

#include <stdio.h>     
#include <stdlib.h>
#include <string.h>    
#define MAX 100
int main ()
{
  char input[MAX];
  char longest="";
  unsigned int count = 0;
  char* stop= "stop";
  char** words = NULL;
  char** pom = NULL;
  int n;

  do {

     printf ("Enter a word ('stop' to end): ");
     scanf ("%s", &input);
     count++;

     pom = (char**) realloc (words, count * sizeof(char*));

     if (pom!=NULL)
    {
       words=pom;
       words[count-1]=input;
    }
     else
    {
       free (words);
       puts ("Error (re)allocating memory");
    }
  } while(strcmp(stop,input)!=0);

  printf ("Words: ");
  for (n=0; n<count; n++)
    printf ("%s ",words[n]);
  free (words);

  return 0;
}

1

Przypuszczam (źle mi się to czyta), że

  words[count-1]=input;

nie robi tego, co byś chciała. komórkę tablicy wypełnia wskaźnikiem na input, ale input lada chwila się zmieni.
Podrzucam do przeczytania dokumentację funkcji

strdup()

UPDATE: kod ma ostrzeżenia od kompilatora, np podstawienie pod longest. Należy się nimi zająć. Po co ta zmienna została wymyślona?

0
AnyKtokolwiek napisał(a):

Przypuszczam (źle mi się to czyta), że

  words[count-1]=input;

nie robi tego, co byś chciała. komórkę tablicy wypełnia wskaźnikiem na input, ale input lada chwila się zmieni.
Podrzucam do przeczytania dokumentację funkcji

strdup()

UPDATE: kod ma ostrzeżenia od kompilatora, np podstawienie pod longest. Należy się nimi zająć. Po co ta zmienna została wymyślona?

zmienna jest dodana jako zmienna pomocnicza, w drugiej części pytania napisałam że potrzebuję również uzyskać najdłuższy napis.

a co do strdup - czyli powinnam do tablicy wstawiać wskaźnik do nowego napisu, który jest kopią oryginalnego input?

1

Na przyszłość nie radzę stosować czegoś takiego: scanf ("%s", &input); Takie coś w programie to vuln, który powoduje w tym przypadku Stack based buffer overflow. Pomyśl - co się stanie jeśli wrzucę do Twojego programu na przykład 1000 znaków zamiast 100? Gdzie te znaki trafią i czy kontrolujesz to gdzie one trafią? https://dhavalkapil.com/blogs/Buffer-Overflow-Exploit/ <- lektura jakbyś była ciekawa dlaczego stosowanie scanf(%s, &input); jest niebezpieczne

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