Pierwsza rada, jeśli kod ma ci coś porównywać i porównuje odwrotnie niż trzeba, pomyśl o odwróceniu warunku, często działa. Więc: if (pom>max) max=pom;
— jeśli wartość pomierzona jest większa niż maksimum, staje się nowym maksimum.
Druga sprawa, że max jest intem. W tej sytuacji, istnieje duże prawdopodobieństwo, że będzie zainicjalizowane zerem, bo w mainie stos jest zwykle świeżutki i nieśmigany. Tak więc błąd zobaczysz dopiero jak wpiszesz same liczby ujemne. Znacznie gorzej będzie jeśli funkcję wydzielisz i użyjesz w większym programie, wtedy stanie się random :) Trzeba zainicjalizować stałą INT_MIN
, żeby upewnić się, że to najmniejsza możliwa wartość.
Alternatywnie można wczytać pierwszą wartość oddzielnie i wstawić ją tam, ale to trochę bardziej złożone, zwłaszcza, jeśli istotnie masz wypisawać całe linie. No bo jeśli nie jest powiedziane, że w każdej linii może być po kilka liczb (a treść zadania zdaje się wskazywać, że tak), musiałoby być to coś takiego:
Kopiuj
char buff[255]; // zakładam, że nie będzie linii dłuższej niż 255 bajtów
char maxline[255];
int max = INT_MIN;
while (fgets(buff, 255, stdin)) {
char *saveptr = NULL;
char *next;
bool is_max = false; // wymaga nagłówka stdbool.h w standardzie C99, inaczej int is_max = 0;
while(next = strtok_r(buff, " \r\n\t", &saveptr)) {
int nexti = atoi(next);
if(nexti >= max) {
max = nexti;
is_max = true;
}
}
if(is_max) {
strcpy(maxline, buff);
}
}
printf ("max = %d, in line:\n%s", max, maxline);
Nie sprawdzałem kodu. Na pewno będzie świrować, jeśli na wejściu pojawi się cokolwiek poza liczbami i wskazanymi białymi znakami (2 parametr strtok). Jeśli będzie kilka linijek z taką samą wartością miniamlną, będzie wypisana ostatnia. Musiałem dać warunek >= max
, na wypadek gdyby pojawiła się tylko INT_MIN
, wówczas maxline nigdy by nie zostało wypełnione. :)