[pytanie] wprowadzanie typu INT do bazy danych

0

Poniższy program opiera się wyłącznie na wprowadzaniu typu char. Co zrobić, zeby numer telefonu można było wpisywać tylko numerycznie? Wiem, ze char akceptuje wszystko ale mi chodzi o to, zeby inne znaki niz cyfry były odrzucane przez program.

/* * * * * * * * * * * * * Pliki  naglowkowe * * * * * * * * * * * * */

#include <stdio.h>    /* Standardowe funkcje wejscia/wyjscia */
#include <string.h>   /* Funkcje przetwarzania tekstu */
#include <stdlib.h>   /* Makrodefinicje EXIT_SUCCESS i EXIT_FAILURE,
                         funkcja system */
#include <ctype.h>    /* toupper */

/* * * * * * * * * * * * * * Komentarz  ogolny * * * * * * * * * * * */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *  Nazwa:     KSIAZKA TELEFONICZNA wersja ANSI-C 0.8d (DOS/UNIX)    *
 *  Autor:     Piotr Grabowski [email protected] www.kursc.prv.pl   *
 *  Opis:      Program umozliwia wprowadzanie, wyszukiwanie,         *
 *             usuwanie, sortowanie oraz przechowywanie w pliku      *
 *             danych o numerach telefonicznych                      *
 *  Data:      10.2000                                               *
 *  Copyright: public domain                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * Makrodefinicje i definicje struktur * * * * * * * */

/* starsze kompilatory */
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif

#define MAX   30   /* Maksymalna liczba wpisow w bazie danych  */
#define INPUT 4    /* Maksymalna dlugosc wprowadzanego indeksu */
#define FALSE 0
#define TRUE  1
#define DOS    /* Wybierz syst. oper.: DOS lub UNIX (ANSI - zaden) */

typedef short int BOOL;   /* Definicja relacji  */

typedef struct        /* Definicja typu strukturalnego telefony   */
{
	char personalia[50];    /* Nazwisko i imie, firma lub pseudonim */
	char adres[50];         /* Miejscowosc                          */
	char telefon[20];       /* Numer telefonu                       */
} telefony;

/* * * * * * * * * * * * * Prototypy funkcji * * * * * * * * * * * * */

void /*inline*/ wyczysc_ekran(void); /* Czysci ekran monitora        */
void /*inline*/ potwierdzenie(void); /* Wyswietla komunikat koncowy  */
int wszystkie_wpisy(void);   /* Listuje wszystkie wpisy w bazie      */
int dane_osoby(void);        /* Prezentuje dany wpis                 */
int szukaj_wpisu(void);      /* Przeszukuje baze                     */
int dodaj_wpis(void);        /* Dodaje nowy wpis                     */
int usun_wpis(void);         /* Usuwa wpis                           */
int zachowaj_baze(void);     /* Zapisuje baze danych do pliku        */
int wczytaj_baze(void);      /* Laduje baze z pliku do pamieci       */
void sortuj_baze(void);       /* Sortuje baze wg pola personalia      */
void info(void);             /* Wyswietla informacje o programie     */


/* * * * * * * * * * * * * Zmienne  globalne * * * * * * * * * * * * */

telefony baza[MAX];   /* Zmienna strukturalna baza */
int numer = 0;        /* Licznik wszystkich wpisow */

/* * * * * * * * * * * * * F u n k c j e * * * * * * * * * * * * * * */

void /*inline*/ wyczysc_ekran(void)
{
#ifdef DOS
	system("cls");
#elif UNIX
	system("clear");
#else
 #define ROWS 40
	for (int i = 0; i < ROWS; i++)
		printf("\n");   /* Wyswietl puste linie */
 #undef ROWS
#endif
}

void /*inline*/ potwierdzenie(void)
{
#ifdef DOS
	printf("\n   ");
	system("pause");
#else
	printf("\n   Nacisnij ENTER, aby kontynuowac...");
	while (getchar() != '\n');
#endif
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Glowna funkcja int main(void)                           *
 *                                                         *
 * zadania: wyswietlanie glownego menu programu;           *
 *          wywolywanie odpowiednich funkcji -             *
 *          modulow programu.                              *
 *                                                         *
 * argumenty przekazywane: brak                            *
 * argumenty zwracane do systemu: kod pomyslnego           *
 *                    zakonczenia programu (EXIT_SUCCESS)  *
 *                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int main(void)
{
char wybor;

	do  /* Petla do-while musi wykonac sie przynajmniej raz */
	{
		/* Menu glowne programu */
		wyczysc_ekran();

		printf("\n   KSIAZKA TELEFONICZNA wersja ANSI-C 0.8d \n\n");

		printf("    [1]  Wyswietl wszystkie wpisy w bazie   \n\n"
			   "    [2]  Przedstaw informacje o osobie      \n\n"
			   "    [3]  Znajdz wpis w bazie danych         \n\n"
			   "    [4]  Dodaj wpis do bazy danych          \n\n"
			   "    [5]  Usun wpis z bazy                   \n\n"
			   "    [6]  Zachowaj baze danych               \n\n"
			   "    [7]  Zaladuj baze danych                \n\n"
			   "    [8]  Sortowanie bazy danych             \n\n"
			   "    [9]  Informacje o programie             \n\n"
			   "    [0]  Wyjscie                            \n\n");

		/* Pobierz dane od uzytkownika */
		printf("   Twoj wybor: ");
		wybor = getchar();
		fflush(stdin);    /* Wyczysc bufor klawiatury */

		wyczysc_ekran();

		/* Wywolanie funkcji w zaleznosci od wyboru uzytkownika */
		switch (wybor)
		{
			case '1' : wszystkie_wpisy();
				break;
			case '2' : dane_osoby();
				break;
			case '3' : szukaj_wpisu();
				break;
			case '4' : dodaj_wpis();
				break;
			case '5' : usun_wpis();
				break;
			case '6' : zachowaj_baze();
				break;
			case '7' : wczytaj_baze();
				break;
			case '8' : sortuj_baze();
				break;
			case '9' : info();
				break;
			case '0' :
				break;
			default :
			{
				printf("\n   Nie ma takiej opcji! \n");
				potwierdzenie();
			}
				break;
		}
	} while (wybor != '0');

	printf("\n   ZAMYKANIE PROGRAMU \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int wszystkie_wpisy(void)                           *
 *                                                             *
 * zadania: wyswietlanie wszystkich wpisow w bazie             *
 *                                                             *
 * argumenty przekazywane: brak                                *
 * argumenty zwracane    : kod zakonczenia:                    *
 * EXIT_SUCCESS (sukces) : baza danych nie jest pusta          *
 * lub                                                         *
 * EXIT_FAILURE (niepowodzenie): w bazie nie ma zadnych wpisow *
 *                                                             *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int wszystkie_wpisy(void)
{
int i;      /* Zmienna pomocnicza - indeks petli */

	printf("\n   WYKAZ WSZYSTKICH WPISOW \n");

	if (numer == 0)    /* Nie ma zadnego wpisu! */
	{
		printf("\n   Baza danych jest pusta"
			   " lub nie zostala zaladowana z pliku! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	/* Wyswietl wszystkie osoby wraz z numerami ich indeksow */
	for (i = 0; i < numer; i++)
	{
		printf("\n   %d   %s", i+1, baza[i].personalia);

		/* Zatrzymaj program po zapelnieniu ekranu */
		if ((i + 1)%10 == 0)
		{
			potwierdzenie();
			wyczysc_ekran();
		}
	}
	printf("\n   Koniec danych \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int dane_osoby(void)                                  *
 *                                                               *
 * zadania: wyswietlanie informacje o wpisie			         *
 *          odpowiadajacemu podanemu indeksowi                   *
 *                                                               *
 * argumenty przekazywane: brak                                  *
 * argumenty zwracane    : kod zakonczenia:                      *
 * EXIT_SUCCESS (sukces) : podany indeks istnieje w bazie        *
 * lub                                                           *
 * EXIT_FAILURE (niepowodzenie): podany indeks jest niepoprawny  *
 *                                                               *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int dane_osoby(void)
{
char wpis[INPUT];		/* Tekst wpisany przez uzytkownika */
int index;				/* Wpis do prezentacji             */

	printf("\n   PREZENTOWANIE DANYCH \n");

	printf("\n   Wprowadz indeks osoby:  ");
	index = atoi(gets(wpis));	/* Konwersja typu danych */

	if (index < 1 || index > numer)	/* Nie ma takiego indeksu! */
	{
		printf("\n   Indeks nie jest poprawny! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}
	/* Drukuj dane na ekranie */
	printf("\n   Nazwisko i imie:  %s", baza[index - 1].personalia);
	printf("\n   Miejscowosc:      %s", baza[index - 1].adres);
	printf("\n   Telefon:          %s", baza[index - 1].telefon);

	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int szukaj_wpisu(void)                            *
 *                                                           *
 * zadania: wyszukanie informacje w bazie -                  *
 *          podanego nazwiska lub miejscowosci               *
 *                                                           *
 * argumenty przekazywane: brak                              *
 * argumenty zwracane    : kod zakonczenia:                  *
 * EXIT_SUCCESS (sukces) : znaleziono minimum jeden wpis     *
 * lub                                                       *
 * EXIT_FAILURE (niepowodzenie): nic nie zostalo znalezione  *
 *                                                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int szukaj_wpisu(void)
{
char szukana[30];      /* Szukane nazwisko lub miejscowosc */
int index, k = 0;      /* Zmienne pomocnicze               */

	printf("\n   WYSZUKIWANIE INFORMACJI W BAZIE \n");

	printf("\n   Wprowadz nazwisko lub miejscowosc do wyszukania: ");
	gets(szukana);
	wyczysc_ekran();
	for (index = 0; index < numer; index++)
	{
		/* Wyswietlanie informacji o wyszukanych wpisach */
		if (strstr(baza[index].personalia, szukana)
			|| strstr(baza[index].adres, szukana))
		{
			printf("\n   Nazwisko i imie:  %s", baza[index].personalia);
			printf("\n   Miejscowosc:      %s", baza[index].adres);
			printf("\n   Telefon:          %s", baza[index].telefon);
			printf("\n  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
			k++;
			/* Zatrzymaj program po zapelnieniu ekranu */
			if (k%3 == 0)
			{
				potwierdzenie();
				wyczysc_ekran();
			}
		}
	}
	if (k == 0)  /* Brak rezultatow! */
	{
		printf("\n   Nie znaleziono zadnego wpisu! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	printf("\n   To wszystkie wpisy jakie znaleziono! \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int dodaj_wpis(void)                              *
 *                                                           *
 * zadania: dodawanie nowego wpisu do bazy danych            *
 *                                                           *
 * argumenty przekazywane: brak                              *
 * argumenty zwracane    : kod zakonczenia:                  *
 * EXIT_SUCCESS (sukces) : dodano nowe informacje do bazy    *
 * lub                                                       *
 * EXIT_FAILURE (niepowodzenie): baza nie zostala zmieniona  *
 *                                                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int dodaj_wpis(void)
{
	printf("\n   DODAWANIE WPISU DO BAZY DANYCH \n");

	if (numer >= MAX)          /* Baza danych jest pelna! */
	{
		printf("\n   Baza danych jest pelna! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	/* Pobierz od uzytkownika wszystkie informacje o osobie */
	/* Sprawdz czy wpisy nie sa za dlugie */
	do
	{
		printf("\n   Nazwisko i imie:  ");
		gets(baza[numer].personalia);
		if (strlen(baza[numer].personalia) > 48)
			printf("\n   Mozna wpisac maksymalnie 48 znakow! \n");
	} while (strlen(baza[numer].personalia) > 48);

	do
	{
		printf("\n   Miejscowosc:      ");
		gets(baza[numer].adres);
		if (strlen(baza[numer].adres) > 48)
			printf("\n   Mozna wpisac maksymalnie 48 znakow! \n");
	} while (strlen(baza[numer].adres) > 48);

	do
	{
		printf("\n   Telefon:          ");
		gets(baza[numer].telefon);
		if (strlen(baza[numer].telefon) > 18)
			printf("\n   Mozna wpisac maksymalnie 18 znakow! \n");
	} while (strlen(baza[numer].telefon) > 18);

	/* Nic nie wpisano w polu Nazwisko i imie lub Telefon */
	if ((strlen(baza[numer].telefon) == 0)
		|| (strlen(baza[numer].personalia) == 0))
	{
		printf("\n   Wpis nie zostal dodany do bazy danych!"
			   "\n   Musi zostac podane nazwisko i numer telefonu! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	/* Do kazdego pola dodaj znacznik konca lini */
	strcat(baza[numer].personalia, "\n");
	strcat(baza[numer].adres, "\n");
	strcat(baza[numer].telefon, "\n");

	numer++;	/* Zwieksz liczbe wpisow o jeden */
	printf("\n   Wpis zostal dodany do bazy danych! \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int usun_wpis(void)                               *
 *                                                           *
 * zadania: usuwanie wpisu z bazy danych                     *
 *                                                           *
 * argumenty przekazywane: brak                              *
 * argumenty zwracane    : kod zakonczenia:                  *
 * EXIT_SUCCESS (sukces) : usunieto informacje z bazy        *
 * lub                                                       *
 * EXIT_FAILURE (niepowodzenie): baza nie zostala zmieniona  *
 *                                                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int usun_wpis(void)
{
char wpis[INPUT];		/* Tekst wpisany przez uzytkownika */
int kasuj_nr;			/* Wpis do usuniecia               */

	printf("\n   USUWANIE WPISU Z BAZY \n");

	printf("\n   Podaj indeks wpisu do usuniecia: ");
	kasuj_nr = atoi(gets(wpis));	/* Konwersja typu danych */

	/* Nie ma takiego wpisu! */
	if ((kasuj_nr < 1) || (kasuj_nr > numer))
	{
		printf("\n   Nie ma w bazie wpisu o takim indeksie! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	/* Usuwanie - przeindeksowanie bazy */
	while ((kasuj_nr - 1) < numer)
	{
		baza[kasuj_nr - 1] = baza[kasuj_nr];
		kasuj_nr++;
	}

	numer--;
	printf("\n   Wpis zostal usuniety \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int zachowaj_baze(void)                         *
 *                                                         *
 * zadania: zapisywanie bazy danych do pliku telefony.dbs  *
 *                                                         *
 * argumenty przekazywane: brak                            *
 * argumenty zwracane    : kod zakonczenia:                *
 * EXIT_SUCCESS (sukces) : baza zostala zapisana           *
 * lub                                                     *
 * EXIT_FAILURE (niepowodzenie): baza nie zostala zapisana *
 *                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int zachowaj_baze(void)
{
FILE *PlikBazy;    /* Wskaznik do pliku bazy */
int i;             /* Zmienna pomocnicza     */
char znak;

	printf("\n   ZAPISYWANIE DANYCH DO PLIKU telefony.dbs \n");
	
	printf("\n   Jestes pewien? [T]ak/[N]ie  ");
	znak = getchar();
	fflush(stdin);
	if (toupper(znak) != 'T')
	{
		printf("\n   Baza danych nie zostala zapisana \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	PlikBazy = fopen("telefony.dbs", "w" );	/* Otworz do pisania */

	/* Nie mozna otworzyc pliku telefony.dbs! */
	if (PlikBazy == NULL)
	{
		printf("\n   Nie mozna otworzyc pliku bazy danych! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}
	
	/* Zapisz aktualna liczbe osob w bazie */
	fprintf(PlikBazy, "%d\n", numer);

	/* Zachowaj reszte danych */
	for (i = 0; i < numer; i++)
	{
		fputs(baza[i].personalia, PlikBazy);
		fputs(baza[i].adres, PlikBazy);
		fputs(baza[i].telefon, PlikBazy);
	}

	printf("\n   Baza danych zostala zachowana! \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja int wczytaj_baze(void)                          *
 *                                                         *
 * zadania: wczytywanie bazy danych z pliku telefony.dbs   *
 *                                                         *
 * argumenty przekazywane: brak                            *
 * argumenty zwracane    : kod zakonczenia:                *
 * EXIT_SUCCESS (sukces) : baza zostala zapisana           *
 * lub                                                     *
 * EXIT_FAILURE (niepowodzenie): baza nie zostala zapisana *
 *                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

int wczytaj_baze(void)
{
FILE *PlikBazy;    /* Wskaznik do pliku bazy */
int i;             /* Zmienna pomocnicza     */

	printf("\n   WCZYTYWANIE DANYCH Z PLIKU telefony.dbs \n");

	/* Otworz plik tylko do odczytu */
	PlikBazy = fopen("telefony.dbs", "r");

	/* Nie mozna otworzyc pliku telefony.dbs!*/
	if (PlikBazy == NULL)
	{
		printf("\n   Nie mozna otworzy pliku bazy danych! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}

	/* Czytaj z pliku aktualna liczbe wpisow w bazie */
	fscanf(PlikBazy, "%d\n", &numer);
	if (numer > MAX)
	{
		printf("\n   W bazie danych jest za duzo wpisow! \n");
		potwierdzenie();
		return EXIT_FAILURE;
	}
	
	/* Czytaj reszte danych z pliku */
	for (i = 0; i < numer; i++)
	{
		fgets(baza[i].personalia, 50, PlikBazy);
		fgets(baza[i].adres, 50, PlikBazy);
		fgets(baza[i].telefon, 20, PlikBazy);
	}

	printf("\n   Baza danych zostala zaladowana! \n");
	potwierdzenie();
	return EXIT_SUCCESS;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja void sortuj_baze(void)                          *
 *                                                         *
 * zadania: Sortowanie babelkowe pol                       *
 *          personalia z tablicy baza                      *
 *                                                         *
 * argumenty przekazywane: brak                            *
 * argumenty zwracane    : brak                            *
 *                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void sortuj_baze(void)
{
char temp[50];
BOOL chaos = TRUE;
int i;

	printf("\n   SORTOWANIE BAZY DANYCH \n");

	while (chaos != FALSE)
	{
		chaos = FALSE;
		for (i = 0; i < (numer - 1); i++)
		{
			if (strcmp(baza[i].personalia, baza[i+1].personalia) == TRUE)
			{
				/* Personalia */
				strcpy(temp, baza[i].personalia);
				strcpy(baza[i].personalia, baza[i+1].personalia);
				strcpy(baza[i+1].personalia, temp);
				/* Adres */
				strcpy(temp, baza[i].adres);
				strcpy(baza[i].adres, baza[i+1].adres);
				strcpy(baza[i+1].adres, temp);
				/* Telefon */
				strcpy(temp, baza[i].telefon);
				strcpy(baza[i].telefon, baza[i+1].telefon);
				strcpy(baza[i+1].telefon, temp);

				chaos = TRUE;
			}
		}
	}
	printf("\n   Baza danych zostala posortowana! \n");
	potwierdzenie();
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Funkcja void info(void)                                 *
 *                                                         *
 * zadania: prezentowanie informacji o programie           *
 *                                                         *
 * argumenty przekazywane: brak                            *
 * argumenty zwracane    : brak                            *
 *                                                         *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void info(void)
{
	printf("\n   INFORMACJE O PROGRAMIE \n");

	printf("\n   Nazwa:    Ksiazka telefoniczna wersja ANSI-C 0.8d"
		   "\n   Autor:    Piotr Grabowski [email protected] www.kursc.prv.pl"
		   "\n   Opis:     Program umozliwia wprowadzanie, usuwanie,"
		   "\n             wyszukiwanie, sortowanie oraz przechowywanie"
		   "\n             w pliku danych o numerach telefonicznych"
		   "\n   Data:     10.2000"
		   "\n   Licencja: public domain \n");

	printf("\n   Jeszcze do zrobienia: \n"
		   "\n    1) Wybor pliku do zapisu"
		   "\n    2) Opcja programu - pomoc \n");

	printf("\n   Poprawiono juz do tej wersji: \n"
		   "\n    1) Blad zwiazany z buforem klawiatury"
		   "\n    2) Bledy zapisu i odczytu danych z pliku"
		   "\n    3) Wiele innych niedociagniec... \n");

	potwierdzenie();
}
/* * * * * * * * * * * *  KONIEC PLIKU telefony.c  * * * * * * * * * */

0

Wystarczy sprawdzić to co zostało wprowadzone w funkcji: int dodaj_wpis(void) dla baza[numer].personalia, można to zrobić np w ten spoób:
do
{
printf("\n Nazwisko i imie: ");
gets(baza[numer].personalia);

            if (strlen(baza[numer].personalia) > 48)
                    printf("\n   Mozna wpisac maksymalnie 48 znakow! \n");
    } while (strlen(baza[numer].personalia) > 48);
0

Co zrobić, zeby numer telefonu można było wpisywać tylko numerycznie?

	char* ptr;
	do
	{
		ptr=text;
		scanf("%19s",baza[numer].telefon);
		while(isdigit(*ptr)&&*ptr)++ptr;
		if(*ptr)printf("\n   zły format numeru!!! \n");
	}while(*ptr);

0

sorry mam mały problem z edycja jeszcze raz:
Wystarczy sprawdzić to co zostało wprowadzone w funkcji: int dodaj_wpis(void) dla baza[numer].personalia, można to zrobić np w ten spoób:
do
{

           printf("\n   Telefon:          ");
            gets(baza[numer].telefon);
            if (!sprawdz(baza[numer].telefon))
                    printf ("\n Bledny numer \n");
            if (strlen(baza[numer].telefon) > 18)
                    printf("\n   Mozna wpisac maksymalnie 18 znakow! \n");
    } while (strlen(baza[numer].telefon) > 18 || !sprawdz (baza[numer].telefon));

int sprawdz (char *ptr) {

   for ()

}

0

idąc metodą 0x666 po wstawieniu kodu do DEV-C++ w linijce

                ptr=text;
                

program pokazuje komunikat:

In function dodaj_wpis': text' undeclared (first use in this function)

natomiast przy wersji amatora problem pojawia sie w linijce:

int sprawdz (char *ptr) {

a mianowicie chodzi o komunikat "syntax error before ")" token"

co moze tu stanowic prolbem?:/

0
bart87 napisał(a)

idąc metodą 0x666 po wstawieniu kodu do DEV-C++ w linijce

                ptr=text;
                

program pokazuje komunikat:

In function dodaj_wpis': text' undeclared (first use in this function)

AAaaa daj

char* ptr=baza[numer].telefon;
0

Poprzedni problem zniknął, natomiast pojawił sie problem tego typu: Wystąpił problem z aplikacją Telefony.exe i zostanie ona zamknięta. Przepraszamy za kłopoty. Mam do wyboru opcje: wyslij raport o błędach albo nie wysyłaj (kto ma XPka to wie o co chodzi ;) )

0

Ogólnie to zamiast gets użyj scanf z ograniczeniem string'a (tak jak podałem w kodzie powyżej).

Takie coś:

gets(baza[numer].personalia);
if(strlen(baza[numer].personalia) > 48)
 [...]

przy wpisaniu powyżej 50 znaków spowoduje zapis poza tablicą, a to jest (dość perfidny) błąd.

0

czyli zamiast standartowego:

do
        {
                printf("\n   Telefon:          ");
                gets(baza[numer].telefon);
                if (strlen(baza[numer].telefon) > 18)
                        printf("\n   Mozna wpisac maksymalnie 18 znakow! \n");
        } while (strlen(baza[numer].telefon) > 18);

powinno być zmodyfikowane:

char* ptr;
        do
        {
                char* ptr=baza[numer].telefon;
                scanf("%19s",baza[numer].telefon);
		if(strlen(baza[numer].telefon) > 10)
                while(isdigit(*ptr)&&*ptr)++ptr;
                if(*ptr)printf("\n   zły format numeru!!! \n");
        }while(*ptr);

tak?

0

A po co to:

if(strlen(baza[numer].telefon) > 10)

??? Do tego co napisałem wcześniej nie trzeba żadnych strlen. Można jeszcze jeszcze dodać:

...
if(*ptr)printf("\n   zły format numeru!!! \n");
else if(ptr-baza[numer].telefon<7)
      {
          printf("\n   numer zbyt krótki!!! \n");
          ptr=baza[numer].telefon; //<--- coby nie skończyła się pętelka 
      }
0

no ale jak wrzuce to:

char* ptr;
        do
        {
                char* ptr=baza[numer].telefon;
                scanf("%19s",baza[numer].telefon);
                while(isdigit(*ptr)&&*ptr)++ptr;
                if(*ptr)printf("\n   zły format numeru!!! \n");
        }while(*ptr);

to windows wyswietla mi błąd systemu :/

chyba, ze ma być tak:

char* ptr;
        do
        {
                char* ptr=baza[numer].telefon;
                ptr=text;
                scanf("%19s",baza[numer].telefon);
                while(isdigit(*ptr)&&*ptr)++ptr;
                if(*ptr)printf("\n   zły format numeru!!! \n");
        }while(*ptr);

??

ewentualnie co zrobic z tym:

ptr=text;

?

0

no ale jak wrzuce to:
[...]
to windows wyswietla mi błąd systemu

A w którym dokładnie miejscu? U mnie to działa bez zarzutu... chociaż format scanf nie jest do końca pewny. Można by użyć globalnego bufora do odbioru stringów i dopiero później kopiować do struktur. Albo tak:

char* get_string(char *buf,int size)
{
	static char buffer[256];
	gets(buffer);

	size=size>256 ? 255 : size-1;

	char *ptr1=buffer;
	char *ptr2=buf;
	char *ptr3=buf+size;

	while(ptr2<ptr3&&(*ptr2=*ptr1++))++ptr2;
	*ptr2=0;

	return buf;
}

i wtedy:

char* ptr; //<---- to MUSI być poza pętlą
do
{
   ptr=get_string(baza[numer].telefon,20);
   while(isdigit(*ptr)&&*ptr)++ptr;
   if(*ptr)printf("\n   zły format numeru!!! \n");
}while(*ptr);


ewentualnie co zrobic z tym:

ptr=text;

No przecież napisałem, że to moja pomyłka - zapomnij o tym.

0

przed tą pętlą mam dwie inne, w których wprowadzam dane typu char, natomiast w tej pętli poniżej wpisuje numer telefonu numerycznie i po zatwierdzeniu Enterem wyrzuca mnie z programu i pojawia sie informacja o błędzie. A mógłbyś przekopiować ten kod(całego programu), który Ci działa?

char* ptr;
        do
        {
                char* ptr=baza[numer].telefon;
                scanf("%19s",baza[numer].telefon);
                while(isdigit(*ptr)&&*ptr)++ptr;
                if(*ptr)printf("\n   zły format numeru!!! \n");
        }while(*ptr);
0

[glowa] Czytaj dokładnie. Napisałem, że musisz usunąć deklarację char *ptr, która jest wewnątrz pętli. To jest przyczyną błędu! I użyj get_string zamiast scanf (i wszędzie tam gdzie pobierasz stringi).

0

ok. sprawdze to wszystko jak wróce do domu bo na razie nie mam dostepu do kompilatora:/ póki co wielkie dzięki. w razie czego będę jeszcze pytał :D

edit:
wielkie dzięki :) wszystko działa ekstra. Nie wyswietla mi jeszcze jednej rzeczy i nie zapisuje do pliku ale to musiałem coś poknocić. Dzisiaj jeszcze posprawdzam wszystko ale mam nadzieje, ze sobie juz sam poradze ;)

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