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

Wczytywanie danych,scanf,getchar

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,060 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 (22,600 p.)
A nie możesz wszystkiego zrobić przy użyciu samego getchar?
komentarz 4 maja 2020 przez TOWaD Mądrala (6,480 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 (6,480 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 (6,480 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ź 916 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 574 wizyt
pytanie zadane 2 lipca 2019 w C i C++ przez Przemek49 Obywatel (1,260 p.)
+1 głos
1 odpowiedź 329 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez reken Początkujący (390 p.)

93,444 zapytań

142,436 odpowiedzi

322,695 komentarzy

62,805 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

...