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