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

Wczytywanie danych,scanf,getchar

VPS Starter Arubacloud
0 głosów
654 wizyt
pytanie zadane 3 maja 2020 w C i C++ przez reken Początkujący (390 p.)

Witam

Mam pewien problem a w zasadzie zadanie do wykonania podobna kwestie znalazlem na forum ale nie bylo odpowiedzi na moje pytanie.Musze wczytac 2 lancuchy znakow i jedna zmienna

struct student_t
{
    char name[20];
    char surname[40];
    int index;
};

Problem w tym ze dane maja byc wprowadzone po przecinku tj przecinek stanowi o tym czy np.name a potem surname  jest dobrze wprowadzona.I wydaje sie ze nie ma w tym nic trudnego ale nie moge zadeklarowac zadnej innej tablicy a jednoczesnie musze pobrac dane.Wiec wymyslilem rozwiazanie ktore pozniej znalazlem na tym forum,mianowicie

answer=scanf("%19[^,], %39[^,], %d",(*p).name,(*p).surname,&(*p).index);
   

Czyli ma pobierac znaki az napotka przecinek.Problem w tym ze mam rozroznic czy jest jedna wartosc wczytana prawidlowo czy dwie, czy wszystkie no i ok tu zwraca mi wartosc prawidlowo wczytanych danych ALE musze rozroznic tez czy problem nie lezy w braku przecinkow i tu jak wprowadzalem wartosci to scanf wariowal.Nie moge rozroznic,Bo gdy wprowadze wszystkei wartosci bez przecinkow zwraca 1 gdy wprowadze pierwsza tablice i zakoncze przecinkiem  tez 1,gdy brak jest wartosci to nadal czeka na przecinek.A w zasadzie nie jestem w stanie sprawdzic czy byl ten przecinek czy nie
I rozwiazanie tj proba:

char chr;
    int answer1,answer2,answer3;
    answer1=scanf("%20s",(*p).name);
    answer2=scanf("%40s",(*p).surname);
    getchar();
    chr=getchar();
    if((chr)=='\n')
        answer3=0;
    else
    {
        ungetc(chr,stdin);
        answer3=scanf("%d",&(*p).index);
    }

    if(answer1==1)
    {
        if(strchr((*p).name,',')!=NULL)
        {
            strtok((*p).name,", ");
            answer1=11;
        }
    }
    if(answer2==1)
    {
        if(strchr((*p).surname,',')!=NULL)
        {
            strtok((*p).surname,", ");
            answer2=22;
        }
    }

Tutaj mialem problem z tym ze po drugim lanuchu znakowym gdy naciskalem enter bo takie sa testy i powinno skonczyc program to on ciagle czekal na %d tj liczbe, program zawieszony dlatego pobieram getchar() czyli znak nowej linii z bufora  a nastepnie kolejny i sprawdzalem czy jest rozny od '\n' jesli tak to spowrotem do bufora a w dalszych warunkach czy wystepuje przecinek jesli tak to zamienialem na znak terminalny i myslalem ze z glowy .Powstal problem ze gdy nazwisko dwu czlonowe oddzielone spacja to konczy czytac bo scanf bo bialy znak

wiec zrobilem tak:

char chr;
    int answer1,answer2,answer3;
    answer1=scanf("%20s",(*p).name);
    getchar();
    answer2=scanf("%40[^,\n]",(*p).surname);
    if(getchar()==',')
        answer2=22;
    getchar();

    chr=getchar();
    if((chr)=='\n')
        answer3=0;
    else
    {
        ungetc(chr,stdin);
        answer3=scanf("%d",&(*p).index);
    }
    if(answer1==1)
    {
        if(strchr((*p).name,',')!=NULL)
        {
            strtok((*p).name,",");
            answer1=11;
        }
    }

wiec teraz przy przykladzie:

Podaj dane: Holly Hunter 215981<znak nowej linii>

Program przerwany; kod błędu=137 (Sygnał SIGKILL)

Test został przerwany; Brak wyświetlonego tekstu!

I faktycznie problem.Dorzuce fragment tresci zadania" Wczytując dane, pamiętaj o usunięciu zbędnych spacji na początku i końcu wprowadzanego wiersza. Aby uznać imię oraz nazwisko za istniejące w tekście podanym z klawiatury, muszą po nich następować przecinki."

Wrzucam bo juz sie chyba 'zacialem' na tym zadaniu tj wydaje mi sie to proste.Pierwsze co bym zrobil to wrzucil dane wejsciowe do nowej tablicy i sprawdzill zawartosc poszczegolnych komorek nastepnie ewentualnie przekonwertowal index na int i chyba bylo by po temacie.Natomiast tu nie moge tego zrobic tj uzywac dodatkowych tablic i jakby nie mam pomyslu na to .Moze ktos cos podsunie ciekawego

komentarz 4 maja 2020 przez overcq Pasjonat (21,540 p.)
A nie możesz wszystkiego zrobić przy użyciu samego getchar?
komentarz 4 maja 2020 przez TOWaD Mądrala (5,700 p.)
#include <stdio.h>
#include <stdlib.h>
char a[20];
char b[30];

int main(){
char comma;
    int p1=0;
    p1=scanf("%19[^,]%c%29[^\n]%c",&a,&comma,&b); //wejście//wejście//1458niuhui,buygyugu
    printf("%s \n %s  \n %d%d",a,b,p1);
//wyjście//
//1458niuhui
//buygyugu
    return 0;
}

powiedziałbym że to działa prawidłowo ale p1= 410949552, EOF?

komentarz 4 maja 2020 przez reken Początkujący (390 p.)

@overcq, w zasadzie ta opcje rozważałem po pierwszym podejściu, ale jak zauważyłem ze dane niejako są wprowadzane w formacie

imię, nazwisko, numer <enter>

Dlatego też chciałem wczytać to wierszem. Ale w sumie spróbuję tak

komentarz 4 maja 2020 przez reken Początkujący (390 p.)

@forestG.tmp,

1. w scanf jak wczucac do tablicy łańcuch nie potrzebny jest & przecież nazwa tablicy jest jednocześnie wskaźnikiem na pierwszą komórkę. 

2.w scanf nie brakuje argumentów? 

Lancuch 19 zapisujesz do a, znak %c do comma, łańcuch 29 do b a ostatni znak %c do czego?

Jakbyś mógł wyjaśnić co miałeś na myśli ogólnie 

1 odpowiedź

+1 głos
odpowiedź 4 maja 2020 przez TOWaD Mądrala (5,700 p.)

sorki tak się trochę spieszyłem i nie po usuwałem( dodawałem) tego co potrzeba.

 p1=scanf("%19[^,]%c%29[^\n]%c",a,&comma,b,&comma);

ale na http://www.elektronik.lodz.pl/wbrzo/03/dod/scanf.html używają do tekstu tak:

 p1=scanf("%19[^,]%c%29[^\n]%c",&a,&comma,&b,&comma);

int main(void)
{ char   tekst [ 50 ];
  int    c;
  long   c_long;
  float  f;
  long double f_long;

  printf("Podaj dowolny tekst do 50 znaków: ");
  scanf("%50s", &tekst);   // wczytywanie tekstu
  fflush(stdin);  // wyczyszczenie z ewentualnych błędów
  printf("\nPodałeś: %s\n", tekst);

jedno i drugie działa poprawnie

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

char b[30];

int main()
{
    char a[20];
    memset(a,0,20);

char comma;
    int p1=0;
    p1=scanf("%19[^,]%c%29[^\n]%c",a,&comma,b,&comma);
 
   printf("%d\n%d\n",strlen(a),strlen(b));
    printf("%s \n %s  \n %d",a,b,p1);
    return 0;
}

 

komentarz 5 maja 2020 przez reken Początkujący (390 p.)
@forestG.tmp,

bardziej mnie interesuje druga opcja.Jak mowilem nie moge uzyc zadnej innej tablicy wiec moze bazowac na tych co mam.

Wiec jesli moglbys mi wytlumaczyc o co chodzi z memset wiem ze funkcja  do usuwania bajtow ale nigdy przedtem nie uzywalem jej wiec  w jakim celu jest tu uzyta
komentarz 6 maja 2020 przez TOWaD Mądrala (5,700 p.)
zera powstawiałem do tablicy czy jest sens nie wiem.

https://pl.wikibooks.org/wiki/C/memset

Podobne pytania

0 głosów
1 odpowiedź 627 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 380 wizyt
pytanie zadane 2 lipca 2019 w C i C++ przez Przemek49 Obywatel (1,260 p.)
+1 głos
1 odpowiedź 263 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez reken Początkujący (390 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...