Wyrażenia regularne przeszukiwanie listy

0

Co może być nie tak w następującym fragmencie programu pełniącego funkcję spisu książek? Po prawidłowej kompilacji dostaję błąd

Regex match failed: failed to match.

void poszukaj(void)
{
struct ksiazka *ptrthis; //wskaźnik na strukturę zawierającą tablicę tytul
if (ptrfirst == NULL) //wskaźnik na pierwszą strukturę, globalny
	{printf("\n Katalog jest pusty."); return;}
int n;
char ch;
char bufor[50];
ptrthis=ptrfirst;
regex_t regex; 
int reti;
char msgbuf[100];
do{
/*printf("W jakim polu chcesz przeszukiwac? 1-tytul 2-autor 3-rok.\n");
ch=getchar();
fflush(stdin);
if(ch!='1' && ch!='2' && ch!='3') printf ("Wpisz jeszcze raz poprawnie.\n");
} while (ch!='1' && ch!='2' && ch!='3'); //zostanie uwzględnione dodane później */
inputs("Wpisz poszukiwany ciag znakow. Mozesz uzywac masek: *-dowolny ciag, ?-dowolny znak.\n", bufor, 50);
zamien(bufor);

/* Compile regular expression */
        reti = regcomp(&regex, bufor, 0);
        if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1);
        }

while(ptrthis)
{
/* Execute regular expression */
        reti = regexec(&regex, ptrthis->tytul, 0, NULL, 0);
        if( !reti ){printf("Tytul: %s\n", ptrthis->tytul);
		    printf("Autor: %s\n", ptrthis->autor);
		    printf("Rok wydania: %s\n\n", ptrthis->rok);
		    n++;     
        }
        else{
                regerror(reti, &regex, msgbuf, sizeof(msgbuf));
                fprintf(stderr, "Regex match failed: %s\n", msgbuf);
                exit(1);
        }
ptrthis=ptrthis->ptrnext;
}
/* Free compiled regular expression if you want to use the regex_t again
*/
	regfree(&regex);
if (n==0) printf("Nie znaleziono podanego wyrazenia.\n");
else printf("Wyszukiwanie zakonczone. Wyniki wyswietlono powyzej.\n");
} //end of poszukaj

funkcje inputs, zamien:

void zamien(char *bufor)
{
int i=0;
int j=0;
char bufor2[100];
do
{
if (bufor[i]=='?')
    bufor2[j+i]='.';
else if (bufor[i]=='*')
{
    bufor2[j+i]='.';
    bufor2[j+i+1]='*';
    j++;
}
else 
    bufor2[j+i]=bufor[i];
i++;
} while(bufor[i]);
strcpy(bufor, bufor2);
}
void inputs(char *prompt, char *s, int count)
{
int i;
char p[255];
do {
printf (prompt);
fgets (p, 254, stdin);
if(strlen(p) > count+1) printf("\nZa dlugi.\n");
} while (strlen(p) > count+1); 
p[strlen(p)-1] ='\0'; /* remove newline character */
strcpy(s, p);
}
0
  1. Przed publikacją kodu źródłowego zawsze sformatuj go poprawnie.
  2. Funkcja 'zamien' jest zła. Nie przepisujesz końcowego znaku '\0' do bufor2. Nie sprawdzasz innych znaków specjalnych.
    Na zachętę daję gotowca, wypadałoby jeszcze sprawdzać, czy nie wyszliśmy poza zakres buforów.
  3. Co do reszty to nie wiem, nie sprawdzałem, kod odpycha.
void zamien(char *bufor)
{
	char bufor2[100], *p, *p2;

	*p = bufor;
	*p2 = bufor2;

	do {
		switch (*p) {
			case '?':
				*p2++ = '.';
				break;

			case '*':
				*p2++ = '.';
				*p2++ = '*';
				break;

			case '[':
			case ']':
			case '\\':
			case '^':
			case '$':
			case '|':
			case '+':
			case '(':
			case ')':
				*p2++ = '\\';
			default:
				*p2++ = *p;
				break;
		}
	}
	while (*p++ != '\0');

	strcpy(bufor, bufor2);
}
0

Dzięki za pomoc. Czy mógłbyś opisać, w jaki sposób kończysz bufor2 zerem?

0

Nie sprawdzam znaku przed przepisaniem go do drugiego bufora tylko po przepisaniu - jeśli było to znak '\0' to przerywam pętlę.

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