Zadanie - łańcuch w C

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.

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.

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>

0
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 :/

0

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

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

1

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

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

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