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?
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 @";
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 ;)
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.
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?
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å
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 @";
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++ ;)
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 @";
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?
279 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849