- Kod: Zaznacz cały
int c,d;
String FName;
FName="Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi"
sscanf (FName.c_str(),"%[a-zA-z0-9.]%[S]%d%[E]%d%[a-zA-z0-9.]",&c,&d);
Nie wiem czemu za kazdym razem wywala wyjatek dostepu do pamieci.
int c,d;
String FName;
FName="Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi"
sscanf (FName.c_str(),"%[a-zA-z0-9.]%[S]%d%[E]%d%[a-zA-z0-9.]",&c,&d);
struct timeE
{
int hour;
int min;
};
timeE GetTimeE(String Value)
{
timeE Result;
int S = Value.Pos(".S");
if(S == 0) return Result;
Value = Value.Delete(1, S + 1);
int E = Value.Pos("E");
Result.hour = Value.SubString(1, E - 1).ToInt();
Value = Value.Delete(1, E);
S = Value.Pos(".");
Result.min = Value.SubString(1, S - 1).ToInt();
return Result;
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
timeE Result;
Result = GetTimeE("Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi");
int c = Result.hour;
int d = Result.min;
Memo1->Lines->Add((String)c + ":" + (String)d);
}
polymorphism napisał(a):Hmm, a skąd ten format string dla sscanf? Pytam, ponieważ nie jest to konstrukcja standardowa, zatem działać nie musi. Jeśli masz możliwość, użyj wyrażeń regularnych (chodzi o bibliotekę), znacznie pewniejsze rozwiązanie.
re->Expression="([a-zA-Z0-9\.\-]+)([S])([0-9]+)([E])([0-9]+)([a-zA-Z0-9\.\-]+)";
if(re->ParseExpression()!=RegularExpression::REG_NOERROR)
ShowMessage("Nieprawidlowe wyrażenie regularne");
if(OpenDialog1->Execute())
{
String asd = OpenDialog1->FileName;
asd = asd.SubString(asd.LastDelimiter("\\")+1,asd.Length());
re->StringToMatch = asd;
if(re->Search())
ShowMessage("Znaleziono poszukiwany ciąg");
else
ShowMessage("Nie znaleziono poszukiwanego ciągu znakow");
}
/* sscanf example */
#include <stdio.h>
int main ()
{
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
}
kozioł napisał(a):Owa funkcja właśnie do tego służy:
Odczytuje dane z ciągu znaków i zapisuje je w zależności od parametru formatu w miejscach podanych przez dodatkowe argumenty. Miejsca wskazane przez wszystkie dodatkowe argumenty są wypełnione odpowiednimi typami wartości określonymi w ciągu formatu. |
char sentence [] = "Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi";
int i, j;
sscanf (sentence, "%*[Greys.Anatomy.] %*[S] %d %*[E] %d", &i, &j);
Memo1->Lines->Add((String)i + " " + (String)j);
String tekst = "Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi";
tekst = StringReplace(tekst, ".", " ", TReplaceFlags() << rfReplaceAll).Trim();
int i, j;
sscanf (tekst.c_str(), "%*s %*s %*[S] %d %*[E] %d", &i, &j);
Memo1->Lines->Add((String)i + " " + (String)j);
AnsiString tekst = "Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi";
int i, j;
sscanf (tekst.c_str(), "%*[a-zA-Z.] %*[S] %d %*[E] %d", &i, &j);
Koziol napisał(a):Skorzystalem z Twojej sugestii i zainstalowałem Regular Expression Component Library jest tylko jeden problem nie mam zupełnie pojęcia jak za pomocą tego komponentu wyciagnac interesujace dane
- Kod: Zaznacz cały
"([a-zA-Z0-9\.\-]+)([S])([0-9]+)([E])([0-9]+)([a-zA-Z0-9\.\-]+)"
Cyfrowy Baron napisał(a):typ [a-zA-Z0-9] jest jednak prawidłowy, to ta kropka stanowi problem, gdyż przy takim zapisie [a-zA-Z0-9.] już typ jest nieprawidłowy.
Konioł napisał(a):przy wyrażeniach regularnych trzeba przed znakami specjalinym . , + - itp użyć znaku \ więc za pewne powinno to wyglądać w sposób następujący: [a-zA-Z0-9\.]
AnsiString tekst = "Greys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi";
tekst = tekst.Insert(" ", tekst.Pos(".S"));
int i, j;
sscanf (tekst.c_str(), "%*[a-zA-Z0-9.] %*[.S] %d %*[E] %d", &i, &j);
AnsiString tekst = "Gre1ys.Anatomy.S03E20.HDTV.XviD2HD.VTV.avi";
tekst = tekst.Insert(" ", tekst.LastDelimiter("S"));
int i, j;
sscanf (tekst.c_str(), "%*[a-zA-Z0-9.] %*[S] %d %*[E] %d", &i, &j);
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 12 gości