barkMedlem sedan jan. 200227 inlägg Hej,
jag vill kontrollera hur många snabel-A en textsträng innehåller. Har kommit så här långt (se kod nedan), sen fattar jag inte mer. Kan någon komplettera koden så den funkar och förklara vad som sker?
else
{
sPos = sText.Find("@");
if (sPos != -1)
{
aPos = aText.Find("@", +1)
}
PeWMedlem sedan juni 200010 432 inlägg En simpel lösning:
int antal=0;
for(int i=0;i<sText.length();i++){
if(sText.at(i)=='@')antal++;
}
//antal innehåller nu antalet kanelbullar
Loopar igenom strängen och jämför char i sträng mot char kanelbulle, ökar på antal med ett varje gång en kanelbulle finns.
------------------
CAFE BABE?
barkMedlem sedan jan. 200227 inlägg Tack för ditt svar, men jag får det fan inte funka. Skulle helst vara en if-string, inte for. Men ok.
Skulle du kunna modifiera min kod så det funkar?
Här under kommer hela...
CString iText;
UpdateData(TRUE);
iText = m_MailAddress;
if (iText.Left(1) == "@")
m_MessageToUser = "Adressen började med @";
else if (iText.Right(1) == "@")
m_MessageToUser = "Adressen slutade med @";
else if
//Här ska koden som kontrollerar att det bara
//finns med ett snabel-A i textsträngen finnas
//Någon som kan skriva in en kod så det funkar?
//För allt jag provar misslyckas!
m_MessageToUser = "Adressen får bara innehålla 1 @";
else
m_MessageToUser = "Adressen är OK";
UpdateData(FALSE);
}
[Redigerat av bark den 01 feb 2002]
PeWMedlem sedan juni 200010 432 inlägg Det mitt lilla exempel visade var hur man kan gå igenom en sträng, tecken för tecken. Om kanelbulle finns så uppdateras räknaren med lika många kanelbullar. För att göra detta måste det till en loop, och i mitt exempel använde jag en for-loop. Men man kan ju ha en while lika gärna som begränsas av '\0'...
Vad menar du med "Skulle helst vara en if-string"?
Det är ju bara att peta in hela loopen i if-satsen!! Du kanske får korrigera variabelnamnen... men själva funktionen är som den är :)
Se den som en pseudo om du inte vill ha just den ;)
------------------
CAFE BABE?
UlfTMedlem sedan maj 20018 027 inlägg -> bark
Du är ute efter att kolla om det är en mailaddress? Börja med PeWs förslag. Därefter använder du en if-sats för att pröva att antal == 1. Då vet du att bara ett snabel-a förekommer.
------------------
Två vägar till framgång:
- Avslöja inte dina hemligheter.
barkMedlem sedan jan. 200227 inlägg Jo, men det finns ett nybörjarsätt också, som jag vill lära mig.
Det ser ut nåt så här typ:
iPos = iText.Find("@");
if (iPos != -1)
{
iPos = iText.Find("@", +1)
//Sen ska här in mer kod...
}
m_MessageToUser = "Adressen innehåller mer än 1 @";
}
Men den är ju inte komplett. Vet ej vad mer jag skall skriva/ändra. Någon som kan få den att funka?
[Redigerat av bark den 02 feb 2002]
PeWMedlem sedan juni 200010 432 inlägg Det du kan göra är att ersätta de ifsatser du hade mot att köra den loopen jag skrev och sen efter detta dra till med kontrollen, typ:
int antal=0;
int pos = 0;
for(int i=0;i<sText.length();i++){
if(sText.at(i)=='@'){
pos = i;
antal++;
}
}//antal innehåller nu antalet kanelbullar
if(antal==1){
if(pos==_pos_){
//allt ok, fortsätt härifrån med
//funktionsanrop eller så...
}
else
//skriv ut felmeddelande
}
else
//skriv ut felmeddelande
_pos_ bör vara en int som motsvarar det index du vill att kanelbullen ska sitta på
------------------
CAFE BABE?
[Redigerat av PeW den 02 feb 2002]
barkMedlem sedan jan. 200227 inlägg Tack, PeW, men det är fortfarande nåt som är fel. Måste man inte ha klammrar efter else if också, eller nåt, annars kommer ju hela skiten direkt i if-satsen..
Argh! Alltid är det små jobbiga fel när man kodar c++!
Här är hela nya koden.
Funkar inte, får bland annat "type 'int' unexpected", "lenght is not a member of CString".. m.m.
CString iText;
UpdateData(TRUE);
iText = m_MailAddress;
if (iText.Left(1) == "@")
m_MessageToUser = "Adressen började med @";
else if (iText.Right(1) == "@")
m_MessageToUser = "Adressen slutade med @";
else if
int antal = 0;
int pos = 0;
for(int i=0;i<iText.length();i++)
{
if(iText.at(i)=='@')
{
pos = i;
antal++;
}
}
//antal innehåller nu antalet kanelbullarif(antal==1)
{ if(pos==_pos_)
{
//allt ok, fortsätt härifrån med
//funktionsanrop eller så...
} else //skriv ut felmeddelande
m_MessageToUser = "Adressen får bara innehålla 1 @";
} else //skriv ut felmeddelande
m_MessageToUser = "Adressen får bara innehålla 1 @";
else
m_MessageToUser = "Adressen är OK";
UpdateData(FALSE);
}
[Redigerat av bark den 02 feb 2002]
[Redigerat av bark den 02 feb 2002]
UlfTMedlem sedan maj 20018 027 inlägg -> bark
"lenght is not a member of CString"
Pröva med iText.GetLength() istället.
------------------
Två vägar till framgång:
- Avslöja inte dina hemligheter.
barkMedlem sedan jan. 200227 inlägg jo, bytter ut lenght och at mot GetLenght och GetAt, men får fortfarande följande fel:
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(191) : error C2062: type 'int' unexpected
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(198) : error C2065: 'antal' : undeclared identifier
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(202) : error C2065: '_pos_' : undeclared identifier
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(207) : error C2181: illegal else without matching if
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(211) : error C2143: syntax error : missing ';' before 'else'
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(214) : error C2501: 'UpdateData' : missing storage-class or type specifiers
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(216) : error C2143: syntax error : missing ';' before '}'
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(216) : error C2143: syntax error : missing ';' before '}'
C:\PROGRAM\MICROSOFT VISUAL STUDIO\MyProjects\CheckAddress\CheckAddressDlg.cpp(216) : error C2143: syntax error : missing ';' before '}'
Error executing cl.exe.
PeWMedlem sedan juni 200010 432 inlägg Ah, jag missade att du kör med cstring ist för string!
Måste man inte ha klammrar efter else if också
Jo. Sätt dit det (rama in den kod du nu lagt till med måsvingar, efter else if) :)
Risken med att klipp & klistra in kod lite huxflux är ju just detta som du råkar ut för. Kanske läge för att gå till botten med att lära sig hur de olika satserna jobbar? Finns gott om böcker i ämnet :) Det finns inga genvägar i att lära sig c/c++ ;)
------------------
CAFE BABE?
barkMedlem sedan jan. 200227 inlägg Har lyckats få ner det till 1 fel. Då ser koden ut som nedan.
Deklarerade antal och pos i header-filen, funkade inte annars. Stört.
Felet som kommer upp är "error C2061: syntax error : identifier 'antal'"
CString iText;
UpdateData(TRUE);
iText = m_MailAddress;
if (iText.Left(1) == "@")
m_MessageToUser = "Adressen började med @";
else if (iText.Right(1) == "@")
m_MessageToUser = "Adressen slutade med @";
else if
antal = 0;
pos = 1;
{
for(int i=0;i<iText.GetLength();i++)
{
if(iText.GetAt(i)=='@')
{
antal = i;
antal++;
}
}
}
//antal innehåller nu antalet kanelbullarif(antal==1)
if(antal>pos){
m_MessageToUser = "Adressen får bara innehålla 1 @";
}
else
m_MessageToUser = "Adressen är OK";
UpdateData(FALSE);
}
[Redigerat av bark den 02 feb 2002]
PeWMedlem sedan juni 200010 432 inlägg Använd kod/perl-taggarna när du klistrar in kod. Lättare att se då...
Som koden ser ut här i tråden hamnar ju en if-sats i en kommentar m.m... ;)
Hur ser headern och HELA .cpp koden ut?
Att deklarera antal i headern är DUMT. Det finns förmodligen flera fel i din kod och att göra ett rakt strukturerat program i c++ går ju, men det är inte säkert att det fungerar som det var tänkt.
I ditt fall vore det bättre/enklast att göra en class av din algoritm och bearbeta strängen med metoder i klassen.
Eller gör på c-vis: En funktion som du petar in det du vill göra i och deklarera variablerna lokalt i funktionen men ta emot strängen som ett const char * s - argument. Att blanda in headern i de små "lokala" variablerna är som sagt inte bra.
Och det vore som sagt inte dumt om du skrev hela källkoden här ;)
------------------
CAFE BABE?