• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pierwszy wyraz

Object Storage Arubacloud
0 głosów
348 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char* get_word(char* str)
{
    char tab[1000] = {0};
    char *wtab = tab;
    int i = 0;
    if(str == NULL)
    {
        return NULL;
    }
    for(; *str; str++)
    {
        if(((*str >= 'a') && (*str <= 'z')) || ((*str >= 'A')  &&  (*str <= 'Z')))
        {
            *(wtab + i) = *str;
            i++;
            if(*(str + 1) == ' ' || *(str + 1) == '\t' || *(str + 1) == 39 || *(str + 1) == '\0' || *(str + 1) == '\n' || *(str + 1) == '.' || *(str + 1) == '-' || *(str + 1) == 0 || *(str + 1) == 34)
            {
                str = wtab;
                return (char*)str;
            }
            
        }
    }
    return NULL;
}

int main()
{
    char tab1[1000] = {0};
    
    printf("Podaj tekst: ");
    scanf("%1000[^\n]", tab1);

    printf("%s", get_word(tab1));

    return 0;
}

Funkcja str ma zwracać pierwszy wyraz w ciągu znaków. Zrobiona przeze mnie funkcja robi to jednak po wrzuceniu zadania do testowania pojawia się komunikat : Pointer to local array variable returned. Komunikat dotyczy 25 linijki. Ktoś wie co mógłbym tutaj poprawić?

1 odpowiedź

+1 głos
odpowiedź 25 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 25 kwietnia 2020 przez ResCrove
 
Najlepsza
Przeczytaj dokładnie co robisz w funkcji str.
1. Deklarujesz lokalną tablicę tab
2. Tworzysz wskaźnik wtab na tablicę tab
3. Kopiujesz do tablicy tab znaki ze zmiennej str
4. Nadpisujesz zmienną str adresem ze zmiennej wtab (teraz zmienna str wskazuje na element w tablicy lokalnej tab)
5. Zwracasz wskaźnik na na element w tablicy lokalnej

Co tak naprawdę chciałeś zrobić?
1. Wykryć pierwsze słowo w przekazanym napisie
2. Zwrócić nowy napis zawierający kopię pierwszego słowa
komentarz 25 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)
Rozumiem, zgadzam się z Tobą w stu procentach. Podpowiedziałbyś jak zrobić to poprawnie?
komentarz 26 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
Jeżeli chcesz skopiować pierwsze słowo musisz:
1. Wykryć pierwszy znak słowa (użyj wskaźnika na ten znak lub indeksu na pole w tablicy)
2. Wykryć ostatni znak słowa (nie zapominając gdzie był pierwszy).
3. Obliczyć długość słowa (oznaczmy ją jako len)
4. Zaalokować nową pamięć na kopiowane słowo (o długości len+1)
5. Przekopiować znaki od pierwszego do ostatniego do nowej tablicy
6. Ustawić ostatni bajt nowej tablicy na zero (znak końca tekstu)
7. Zwrócić nową tablicę
Pamiętaj żeby zwolnić tą pamięć przed opuszczeniem programu
komentarz 26 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)
Jeszcze nie miałem alokacji pamięci w szkole. Da się to zrobić przy użyciu samych wskaźników?
1
komentarz 26 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Bez alokacji pamięci nie zwrócisz kopii.
Możesz przerobić funkcje tak, aby przepisywać znalezione słowo do drugiej tablicy przekazanej do funkcji

Przykład:
 

void kopiuj_napis(const char *napis_wejsciowy, char *napis_wyjsciowy, int dlugosc_tablicy_wyjsciowej) {
    int przepisane_bajty = 0;
    while (*napis_wejsciowy>= 'a' && *napis_wejsciowy<= 'z' && przepisane_bajty < dlugosc_tablicy_wyjsciowej-1) {
        napis_wyjsciowy[przepisane_bajty] = *napis_wejsciowy;
        przepisane_bajty++;
        napis_wejsciowy++;
    }
    napis_wyjsciowy[przepisane_bajty] = NULL;
}

 

komentarz 26 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)
Dzięki, teraz rozumiem

Podobne pytania

0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 22 grudnia 2017 w C i C++ przez MikeMG Początkujący (330 p.)
0 głosów
2 odpowiedzi 213 wizyt
0 głosów
1 odpowiedź 154 wizyt
pytanie zadane 10 lutego 2016 w C i C++ przez luparuwka Początkujący (400 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...