Czy wprowadzana dana jest liczbą?

0

Witam,

mój program działa następująco: użytkownik jest proszony o wprowadzenie wielkości progu ( wartość liczbowa ), jeżeli ktoś zamiast liczb wpisze jakąś literę, program zapętla się całkowicie i trzeba przerwać proces.
Właśnie tu pojawia się mój problem: chciałbym, aby gdy użytkownik NIE wpisze cyfry pojawił się odpowiedni komunikat i prośba o ponowne wprowadzenie danych. Próbowałem skorzystać z funkcji isdigit ale ona podobno sprawdza tylko jedną cyfrę, a nie liczbę.
Proszę o jakąś podpowiedź, chciałbym to zrobić w najbardziej prosty możliwy sposób.

To co tu wkleiłem to jedna z funkcji...
Skompilowany kod w takiej funkcji wyrzuca: naruszenie ochrony pamięci.

int progowanie(t_obraz *obraz)
{
  int i, j;
  int prog;
  int(*obraz_pgm)[obraz->wymy];
  obraz_pgm=(int(*)[obraz->wymx]) obraz->obraz_pgm;

  printf("Podaj wartość progu:\n");
  scanf("%d", &prog);
  
while(!isdigit(&prog))
{
printf("Wpisz liczbę, a nie znak:\n");
scanf("%d", &prog);
}
  
while(prog>(obraz->szarosci))
    {
      printf("Wartość progu większa od maksymalnej skali szarości, spróbuj jeszcze raz.\n");

    printf("Podaj wartość progu:\n");
  scanf("%d", &prog);
 }

 for(j=0; j<obraz->wymy; j++)
    {
      for(i=0; i<obraz->wymx; i++)
	{
	  if(obraz_pgm[i][j]<=prog)
	    {
	     obraz_pgm[i][j]=0;
		}
	  if(obraz_pgm[i][j]>prog)
	    {
	      obraz_pgm[i][j]=(obraz->szarosci);
	    }
	}
    }
  return(0);
}

Proszę o pomoc.

0

Wczytaj to jako tekst. Później co najmniej dwie możliwości:

  1. Pętelka w której sprawdzasz każdy znak poprzez isdigit
  2. Sprawdzasz czy wczytany tekst jest dłuższy niż 1 znak:
  • jeżeli tak to robisz atoi - gdy nie zwróci zera to jest poprawną liczbą
  • jeżeli nie to robisz po prostu isdigit na wczytanym znaku
0

Dzięki wielkie Shalom, chciałbym też spróbować to zrobić za pomocą pierwszego sposobu, który podał sephirot8608. Niestety nie do końca wiem jak... Najpierw używam funkcji scanf ( tylko jak podzielić cały łańcuch znaków na poszczególne elementy ? ), później pętla while z funkcją isdigit z odwołaniem do pojedynczych znaków...

0

na przykład tak:

    char ciag[32];
    int i = 0;
    printf("Podaj wartość progu:\n");
    scanf("%s", ciag);

    do
    {
        if ( !isdigit( ciag[i] ) )
        { 
          printf("ERROR - zrób z tym co chcesz");
          break;
        }
    }
    while ( ciag[++i] != '\0' && i < 32 );

Pominąłem tutaj zabezpieczenie, że liczba jest zbyt długa ale to już chyba sobie poradzisz.

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