Zadanie - łańcuch w C

Zadanie - łańcuch w C
R3
  • Rejestracja:ponad 4 lata
  • Ostatnio:11 miesięcy
  • Postów:6
0

Witam. Potrzebuje pomocy w poniższym zadaniu.
"Zaprojektuj funkcję, która pobiera z danych wejściowych i zapisuje do przekazanej tablicy pierwsze słowo, a resztę wiersza porzuca. Funkcja powinna pomijać
znaki odstępów na początku wejścia. Za słowo możesz uznać ciąg znaków niezawierający odstępów, tabulatorów lub znaków nowej linii. Użyj funkcji getchar().
Zaprojektuj i przetestuj funkcję z poprzedniego ćwiczenia, która dodatkowo przyjmuje w wywołaniu limit liczby wczytywanych znaków"

Udało mi się zrobić coś takiego.

Kopiuj
char * slowo(char * lan, int n)
{
    char * wynik;
    char * temp;

    wynik = fgets(lan,n,stdin);

    if(wynik)
    {
        while(*lan == ' ' || *lan == '\t')
            lan++;

        temp = lan;
        while(*temp != '\n' && *temp != '\0' && *temp != ' ' && *temp != '\t')
            temp++;
        if(*temp == '\n' || *temp == ' ' || *temp == '\t')
            *temp = '\0';
        else
            while(getchar()!='\n')
            continue;
    }

    return wynik;

Funkcja ta czyta zawsze jeden słowo, lecz jeśli na początku znajdują się jakieś znaki odstępu to one również są kopiowane do tablicy. Nie mam pomysłu jak to przerobić, żeby działało tak w jak w treści zadania.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Szczecin
4

Dlaczego używasz fgets() jeśli zadanie wyraźnie mówi aby użyć getchar()?

Masz trzy zmienne, których używasz do poruszania się po jednej tablicy i z tego powodu masz problem. Przepisz funkcję od zera, nie używając fgets(), a wyłącznie getchar(). Algorytm jest prosty

  1. dopóki masz na wejściu znak biały - zignoruj
  2. dopóki masz na wejściu znak niebiały - dopisz na koniec tablicy

Dla wygody użyj <ctype.h>


R3
  • Rejestracja:ponad 4 lata
  • Ostatnio:11 miesięcy
  • Postów:6
0
Kopiuj
void slowo2(char * lan, int n)
{
    int i=0;
    while((*lan=getchar()) != EOF && *lan !='\n' && i<n)
    {
        if(isspace(*lan)) break;
        lan++;
        i++;

    }
    *lan='\0';
}

Tylko nie mam pojęcia jak to zmodyfikować, żeby funkcja ignorowała białe znaki na początku :/

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Szczecin
0

Zrób drugą pętlę. Zresztą warunki i tak masz przekombinowane. Wczytuj znak do zmiennej tymczasowej.


AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
1
kq napisał(a):

Zrób drugą pętlę. Zresztą warunki i tak masz przekombinowane. Wczytuj znak do zmiennej tymczasowej.

Ze wszech miar popieram.
Zwłaszcza porównanie do EOF-a porządnie się zapisuje tylko na int.

Update: plus warto zalecić najpierw pisanie skutecznych algorytmów, dopiero potem w hackerskim stylu


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
R3
  • Rejestracja:ponad 4 lata
  • Ostatnio:11 miesięcy
  • Postów:6
1

Po użyciu drugiej pętli i zmiennej tymczasowej udało mi się w końcu to wykonać. Dzięki za pomoc

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
2
Kopiuj
void slowo2(char *lan,int n)
{
    const char *end=lan+n-1; // -1 aby '0' się zmieścił
    for(int space=1;(lan<end)&&((*lan=getchar())!=EOF);*lan='\0')
    {
        if(!isspace(*lan)) space=!(++lan);
        else if(!space) break;
    }    
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.