C - program wypisujący największy i najmniejszy parametr

0

Witam, mam za zadanie napisać program wypisujący z cmd największy i najmniejszy z parametrów wprowadzonych do cmd. Niestety, program przypisuje jako największą wartość ostatni parametr, zamiast parametru o największej wartości. Prosiłabym o wskazówkę dlaczego tak się dzieje?

Domyślam się, że problem jest w tych dwóch if-ach.


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

int main(int argc, const char * argv[])
{

    if (argc==1)
        printf("\nOnly one parameter!\n");
    else
    {
        int i=1;
        int maxim=argv[1];
        int minim=argv[1];

        do
        {
            if(isdigit(*argv[i]))
            {
                if (argc==2)
                {
                    printf("The maximal value of integer is: %s \n", argv[1]);
                    printf("The minimal value of integer is: %s \n", argv[1]);
                }
                else
                {
                    if(argv[i]<=minim)
                    {
                        minim=argv[i];
                    }

                    if(argv[i]>=maxim)
                    {
                        maxim=argv[i];
                    }
                }
            }

            else
            {
                printf("Taki chuj");
                return 0;
            }

        i++;
        }
        while(i<argc);
                    printf("Maxim: %s \n", maxim);
                    printf("Minim: %s \n", minim);

    }

    return 0;
}
0
int maxim=argv[1];

if(argv[i]<=minim)

argv[1] to jest ciąg znaków. Musisz najpierw przekonwertować ten ciąg znaków na liczbę, i dopiero wtedy możesz porównywać lub przypisać do zmiennej typu int. W tej chwili ta zmienna trzyma nie wartość liczbową w tym ciągu, tylko pewnie jakiś wskaźnik.

0

Czyli rozumiem, że zamiast argv[i] powinno być atoi(argv[i])?

0

Teraz program wywala na pierwszym sprawdzeniu jakie liczby przyjmuje minim i maxim

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

int main(int argc, const char * argv[])
{

    if (argc==1)
        printf("\nOnly one parameter!\n");
    else
    {
        int i=1;
        int maxim=atoi(*argv[1]);
        int minim=atoi(*argv[1]);
        printf("maxim: %d \n", maxim);
        printf("minim: %d \n", minim);

        do
        {
            if(isdigit(*argv[i]))
            {
                if (argc==2)
                {
                    printf("The maximal value of integer is: %d \n", argv[1]);
                    printf("The minimal value of integer is: %d \n", argv[1]);
                }
                else
                {
                    if(atoi(*argv[i])<=minim)
                    {
                        minim=atoi(*argv[i]);
                    }

                    if(atoi(*argv[i])>=maxim)
                    {
                        maxim=atoi(*argv[i]);
                    }
                }
            }

            else
            {
                printf("Taki chuj");
                return 0;
            }

        i++;
        }
        while(i<argc);
                    printf("END maxim: %d \n", maxim);
                    printf("END minim: %d \n", minim);

    }

    return 0;
}
0

Na rzecz atoi o sygnaturze int atoi (const char * str); raczej nie powinnaś wyłuskiwać wartości. Poza tym isdigit może nie spełnić Twoich oczekiwań jeśli przekażesz mu c-string zamiast pojedyńczego znaku.

0

Kurczę, nie bardzo rozumiem ;c

0

To znaczy że wywołując atoi w taki sposób jak na Twoim listingu powinnaś z miejsca dostać błąd o naruszeniu ochrony pamięci (core dump). Poza tym pamiętając o kolejności wywołania operatorów z lewej do prawej zapis

int arg = atoi(*argv[1]);

znaczy mniej więcej tyle:

  1. *argv pobierz wartość znajdującą się pod argv czyli zazwyczaj nazwę binarki
  2. *argv[1] spod wartości wybranej z punktu pierwszego daj mi to, co kryje się pod indeksem pierwszym
    Czyli taka mała kaszana się robi. atoi wywołujesz po prostu atoi(argv[indeks]); jeśli masz pewność że pod wskazanym indeksem znajduje się liczba. Jeśli chodzi o isdigit to wszystko masz w dokumentacji http://www.cplusplus.com/reference/cctype/isdigit/. Musisz zrobić pętelkę po całym c-stringu bo ta funkcja potrafi pracować tylko z jednym znakiem.
0

Ok, poprawiłam na razie atoi, jest tak i działa! (dzięki wielkie :))

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

int main (int argc, const char * argv[])
{

    if (argc==1)
        printf("\nOnly one parameter!\n");
    else
    {
        int i=1;
        int maxim=atoi(argv[1]);
        int minim=atoi(argv[1]);

        do
        {
            if(isdigit(argv[i]))
            {
                if (argc==2)
                {
                    printf("The maximal value of integer is: %d \n", maxim);
                    printf("The minimal value of integer is: %d \n", minim);
                }
                else
                {
                    if(atoi(argv[i])<=minim)
                    {
                        minim=atoi(argv[i]);
                    }

                    if(atoi(argv[i])>=maxim)
                    {
                        maxim=atoi(argv[i]);
                    }
                }
            }

            else
            {
                printf("Taki chuj");
                return 0;
            }

        i++;
        }
        while(i<argc);
                    printf("END maxim: %d \n", maxim);
                    printf("END minim: %d \n", minim);

    }

    return 0;
} 

Zabieram się za 'walkę' z isdigit ;)

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