Zakonczenie wczytywania C

0

Witam. Napisałem taki programik, który kompiluje się, ale w wykonaniu sie wykłada. Jest problem z pętlą wczytywania nazwisk. Wczytywanie powinno się zakończyć po wpisaniu pustego nazwiska (a następnie posortowane po kodzie i wypisane), ale coś się chrzani i nie bardzo wiem co. Jest problem z wyjściem z pętli wczytywania. Podpowiedzcie proszę coś.

#include <stdio.h>/właczanie plików bibliotecznych/
#include <stdlib.h>
#include <string.h>

//struktura danych pojedyńczej osoby

struct osoba{
char kod[3]; // kod 3 elementowy
long int zar; // wysoko?ć zarobków
char im[30]; // imię przyjęte max. 30 liter
char nazw[30]; // nazwisko przyjęte max. 30 liter

}tab[40]; // zmienna typ tablica 40 elementowa zawieraj?ca osoby

//funkcja prownania 2 elementow

int porownaj(struct osoba, struct osoba); // deklaracja funkcji
int porownaj(struct osoba a, struct osoba b)
{
if (strcmp(a.kod, b.kod) >0) return 0; // kod - osoba a wieksza od b
if (strcmp(a.kod, b.kod) <0) return 1; // kod - osoba b wieksza od a
if (a.zar>=b.zar) return 1; // zarobki - osoba a większa lub równa b
return 0; // zarobki - osoba a mniejsza od b

};

int main()
{
int i, j, i_pom, ile; // i,j zmienne przesuwania w tablicy, i_pom zmienna pomocnicza
struct osoba pom; // ile to ilo?ć osób w tablicy

i=0;
while (1) // czytanie z klawiatury do?óki wyrażenie jest prawdziwe
{
if (i==39) break;

printf ("Podaj nazwisko: \n");
scanf ("%s", &tab[i].nazw);

if (tab[i].nazw[0]=='\n')

{
printf("Zakonczyles wprowadzanie. Teraz nastąpi sortowanie\n");
break;
};

printf ("Podaj imie: \n");
scanf ("%s", &tab[i].im);

printf ("Podaj kod: \n");
scanf ("%s", &tab[i].kod);

printf ("Podaj zarobki: \n");
scanf ("%d", &tab[i].zar);

i++;

};
ile=i;
//sortowanie po kodzie

for (i=0; i<ile-1; i++) {
i_pom=i;
pom=tab[i];
for (j=i+1; j<ile; ++j)
if (porownaj(tab[j], pom)) {
i_pom=j; pom=tab[j];
};
tab[i_pom]=tab[i];
tab[i]=pom;
};

// wyswietlanie wyniku posortowanego
for (i=0; i < ile; i++)
{

printf (" nazwisko: %s ",tab[i].nazw ); // wy?wietlanie i-tego nazwiska
printf (" imie: %s ",tab[i].im ); // wy?wietlanie i-tego imienia
printf (" kod: %s ",tab[i].kod ); // wy?wietlanie i-tego kodu
printf (" zarobki: %d \n",tab[i].zar ); // wy?wietlanie zarobków
};

}

0

if (tab[i].nazw[0]=='\n') dziwne myślałem że znak końca łańcucha to '\0' :)

if (tab[i].nazw[0]=='\0') - spróbuj teraz.

0

Niestety w ten sposób nie działa, bo w ogóle nie przerywa pętli. Pętla wprowadzanie musi kończyć się wpisaniem pustego nazwiska. Po naciśnięciu enter program powinien posortować dotychczasowe wpisy i wyświetlić. Ja myślałem, żeby może zainicjować tablicę jakimiś wartościami i przynapotkaniu takiej kończyć, ale to jest raczej zbyt ptracochłonne dla kompa i nieefektywne. :-/

0

Jest jeden powazny blad w koncepcji.
scanf nie potrafi poradzic sobie z wczytaniem pustego ciagu(czyt. Enter i nic wiecej, nie wiem czy naewt sobuie ze spacja poradzi)
Moze sprobuj zamiast pustego nazwiska cos takiego jak pytanie po kazdym czy kontynuowac, albo po wprowadzeniu jakiego symbolu np. # konczyc. :]

0

Tak zrobiłem. Dzięki.

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