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

dzielenie na oddzielne zmienne słów sczytanych fgets'em

0 głosów
1,000 wizyt
pytanie zadane 1 grudnia 2015 w C i C++ przez Koko$ Użytkownik (740 p.)
Witam, ma ktoś jakiś pomysł na to, aby po tym jak program sczyta linie wpisaną przeż użytkownika dodało mi każde z nich do innej tablicy charów. Chodzi o C. z góry dzięki za pomoc

4 odpowiedzi

+1 głos
odpowiedź 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
wybrane 3 grudnia 2015 przez Koko$
 
Najlepsza

Kolega draghan propozycje podrzucił, jak można ten problem rozwiązać. Ze swojej strony, mógłbym ewentualnie zaproponować użycie funkcji strtok(). Wrzuć co stworzyłeś, to łatwiej będzie Ci pomóc, podpowiedzieć coś.
http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok

komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
http://hastebin.com/oyicapojox.avrasm

 

Prowadzący powiedział, że ograniczenie tablic charów dla imienia i nazwiska po 30znaków każdy jest złe, ponieważ użytkownik będzie mógł na zawołanie "złamać" program i powiedział, żebym użył tu funkcji fgets. Nie rozumiem jak ona ma tu pomóc, ponieważ i tak będę musiał przepisać dane które oddzyta fgets do tablic, w których będe musiał podać ich rozmiar.
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
No fakt, w tym miejscu można złamać program. fgets() jest o tyle dobre, że możesz ograniczyć liczbę wprowadzanych znaków (drugi argument tej funkcji). Jak już tym fgets() wczytasz cały ten złom, to przy cięciu tego na kawałki, możesz sobie wyliczyć długość imienia, nazwiska, etc. Tablice w takim przypadku to tablice dynamicznie alokować (malloc()), rozmiar w zależności od tego jak długie imię, nazwisko, etc.
komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
http://hastebin.com/evuduqexoj.vala

z strtok mam tylko takie coś. Jak to zapisać do zmiennych, tak żeby móc potem to porównać?
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Do zmiennej token jest zapisywany wyodrębiony ciąg, żeby to skopiować do innej zmiennej trzeba użyć strcpy() albo strncpy().
komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
jak to powinno wyglądać w kodzie?
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)

Przykładowo tak. Ciąg wejściowy, przy użyciu funkcji strtok() został podzielony na 3 ciągi (w pierwszy imie, w drugim nazwisko, w trzecim data).
 

#include <string.h>
#include <stdio.h>
int main()
{
char ciag[] = "Imie Nazwisko 1996-03-22";
char znaki_podzialu[] = " ";
char * token;
char ciete[3][15];//k

printf( "Podzial tekstu \"%s\" na pojedyncze wyrazy:\n", ciag );
token = strtok(ciag, znaki_podzialu );
int i=0;    //k
while( token != NULL )
{
    //printf("%s \n", token);
    strcpy(ciete[i],token); //k
    i++;    //k
    token = strtok( NULL, znaki_podzialu );
}

for (i=0;i<3;i++)   //k
    puts(ciete[i]); //k
return 0;
}

 

komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
http://hastebin.com/xeravateno.avrasm

 

W dobrą strone ide? Wywala mi mnóstwo błędów ale gdybym zrzutował daty na inty to by poszło(chyba). Musze robić przepisywanie (linie 69-74) czy da się to jakoś inaczej zrobić?
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Zaraz to dokładniej przejrzę. Jak nic nie przeoczyłem, to Data jest w postaci stringu (char). W takim wypadku porównywanie tego ze zmiennym typu int jest bez sensu, bo porównujesz kod ASCII pierwszego znaku tablicy char (rok, miesiac, dzien) z liczbą, np. 1900.
komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
czyli musze jakoś zmienić te chary z daty na int?
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Tak, musi być to zamienione. Albo pola struktury Data na int albo to z czym porównujesz pola struktury Data(rok,miesiac,dzien) na char.
komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
W pewnym miejscu musze wyliczyć modulo. Da rade na charach?
komentarz 2 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)

Może kompilator by to przetrawił, ale będzie podobnego rodzaju problem. Jeśli podasz np.rok 1991, to modulo będzie wykonywane na liczbie 31h (kod ASCII znaku '1') a nie na liczbie 1991.
Troche polukałem po kodzie:
 

//Dane stanowia sekwencje zlozone z nazwiska,imienia oraz daty urodzenia postaci rrrr-mm-dd.
//Wprowadzanie danych konczy pusty wiersz.
//Wyswietlic liste nazwisk uporzadkowana w/g malejacego wieku.
//Liczba osob opisanych w danych wejsciowyuch nie przekracza 40.
//Zastosowac sortowanie metoda prostego wybierania

#include <stdio.h>
#include <stdlib.h>

enum {wyst,niewyst} blad=niewyst;//okreslenie czy blad wystapil, czy nie

enum {przestepny,nieprzestepny} rok=nieprzestepny;//zmienna okreslajaca czy rok jest przestepny

typedef struct
{
    int rok;
    int miesiac;
    int dzien;
} Data;

typedef struct
{
    char imie [30];
    char nazwisko[30];
    Data data_ur;
    int n;//klucz do sortowania w formacie rrrrmmdd
} Osoba;


int main()
{
    int i=0;
    int x=0;//sprawdza ile osob zostalo wprowadzonych
    char ciag[256];
    char znaki_podzialu[] = " -";
    char * token;
    char ciete [5][100];//k
    Osoba osoby[40];
    puts("Program sortujacy osoby w/g malejacego wieku.");
    puts("Wpisz imie, nazwisko oraz date urodzenia(rrrr-mm-dd).");
    puts("Aby zakonczyc wpisywanie wybierz <q/Q>.");
    while (i++<2)//petla do wczytywania do 40 osob
    {
        fgets(ciag,256,stdin);
        if (*(ciag)=='q')
            break;
        token = strtok(ciag, znaki_podzialu);
        int j=0;
        while( token != NULL )
        {
            strcpy(ciete[j],token);
            j++;
            token = strtok( NULL, znaki_podzialu );
        }
        strcpy(osoby[i].imie,ciete[0]);
        strcpy(osoby[i].nazwisko,ciete[1]);

        osoby[i].data_ur.rok=atoi(ciete[2]);
        osoby[i].data_ur.miesiac=atoi(ciete[3]);
        osoby[i].data_ur.dzien=atoi(ciete[4]);
    }
    puts("Dziekuwa.");
    return 0;
}

Data jest zrobiona na zmiennych int, co potem upraszcza sprawę przy porównianiach, modulo, etc.

komentarz 3 grudnia 2015 przez Koko$ Użytkownik (740 p.)
dzięki wielkie, wisze Ci czteropak ;d
komentarz 3 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Spoko.;) Powiedziałbym, że poproszę to na piśmie.  Ale w tej sytuacji, to nawet nie muszę tego robić.;)
0 głosów
odpowiedź 1 grudnia 2015 przez draghan VIP (106,230 p.)
Szukasz któregokolwiek białego znaku w łańcuchu i na tej podstawie rozdzielasz sobie poszczeŋólne słowa. Możesz to zrobić najprostszą pętlą for, aczkolwiek do wyszukiwania znaków czy podciągów w łańcuchu istnieją odpowiednie funkcje standardowe.
komentarz 1 grudnia 2015 przez Koko$ Użytkownik (740 p.)
o jakich funkcjach mówisz?
komentarz 1 grudnia 2015 przez draghan VIP (106,230 p.)

O funkcjach zadeklarowanych w nagłówku string.h o pięknie brzmiących nazwach: strstr(), strchr() oraz strpbrk().

komentarz 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
Mógłbyś dać jakieś dalsze podpowiedzi? siedze 2 dzień nad tym i nie moge nic wymyślić a termin oddania projektu mam za 2 dni
0 głosów
odpowiedź 2 grudnia 2015 przez Koko$ Użytkownik (740 p.)
ma ktoś jakiś pomysł jak to zrobić? siedze drugi dzień i nic nie moge wymyślić ;/
0 głosów
odpowiedź 2 grudnia 2015 przez event15 Szeryf (93,790 p.)

sczyta

Nie powinno być "wczyta"? Bo sczytywać to wg PWN oznacza "czytając, porównać tekst przepisany z oryginałem"

Podobne pytania

0 głosów
0 odpowiedzi 321 wizyt
pytanie zadane 8 września 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 1,009 wizyt
0 głosów
2 odpowiedzi 1,072 wizyt
pytanie zadane 29 listopada 2017 w C i C++ przez Krystek102 Bywalec (2,440 p.)

93,735 zapytań

142,671 odpowiedzi

323,294 komentarzy

63,297 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...