Permalänk
Medlem

Problem med c++ program

Försöker kompilera följande program:

http://www.copypastecode.com/25508/

Men får meddelandet "invalid suffix "find" on floating constant. Vad har jag gjort för fel?

Permalänk
Hedersmedlem

Du har skrivit

second = first+1.find('*',first+1);

, vilket du förmodligen inte menar.
1. är ett flyttal och "find" är inget giltigt suffix för sådana. De har heller inga medlemsfunktioner (vilket till exempel strängar har).

Permalänk
Medlem

Det största problemet är nog att du krånglar till det för dig...:)

Använd en STL container, tex vector:
http://www.cplusplus.com/reference/stl/vector/

Du vill ha datat som ligger i minnet användbart så du vill inte gärna skapa skumma representationer med * som separator i ditt fall... direkt när man läser eller skriver till fil är den enda gången du vill göra någon form av representation av datat..

Typ så här i pseudo kod:

struct NameEntry { string firstName; string lastName; string phoneNumber; }; vector<NameEntry> entries; void addEntry(NameEntry entry) { entries.push_back(entry); } void saveToFile() { for (i=0; i < entries.size(); i++) { output << entries[i].firstName << '*' << ... }

Nu orkar jag inte tänka längre... läggdags... men troligtvis så har du fått lite kött på benen.

Fast vill du bara få skiten att funka så antar jag att detta borde funka...

antar att du vill hitta index för första och andra '*' i namelist[i]

då borde detta funka:
second = namelist[i].substr(first+1).find('*');

Denna kod ser även lite suspekt ut:

firstname = namelist[i].substr(0,first); lastname = namelist[i].substr(first+1,second-first-1); phonenumber = namelist[i].length();

Lättaste är att splitta med hjälp av strtok som finns i string.h,
den är lite C-aktig eftersom den jobbar med char[] och attt den även modifierar din sträng så bästa är att göra en kopia av din sträng innan:

char* nameListCopy = new char[namelist[i].size() + 1]; strcpy(nameListCopy, namelist[i].c_str()); firstname = strtok(nameListCopy, '*'); lastname = strtok(nameListCopy, '*'); phonenumber = strtok(NULL, '*'); delete [] nameListCopy;

Sen känns det lite som du antingen är gammal C-programmerare eller att du har hittat exempelkod som en C-programmerare har skrivit eftersom du deklarerar alla variabler först i metoderna...

Det är tydligare att deklarera variablerna så nära stället där de används istället för att scrolla upp för att hitta vad variabeln är för typ.

Sen borde first och second vara av typen size_t för att vara portabelt.

Det finns massor med gottigott på cplusplus.com så jag rekommenderar dig att bekanta dig med exemplen där så du skriver mer C++ kod som utnyttjar styrkan i språket så det inte bara är C med steroider (inget illa menat om C, iallafall om vi snackar C99, C har sina användningsområden oxå)

Permalänk
Medlem

Fake edit:

Fick lite panik när jag tipsade om strtok och kom på hur mycket problem jag hade med den när jag insåg att den kladdar i det man skicka in i den så const-strängar och literals är ingen höjdare för den...

Så detta är lite mer C++ och borde funka bättre för att splitta en sträng

#include <iostream> #include <sstream> #include <vector> #include <string> std::vector<std::string> splitString(std::string sourceString, char delimiter) { std::vector<std::string> tokenVector; std::istringstream tokens(sourceString); do { std::string token; std::getline(tokens, token, delimiter); if (token.size() > 0) { tokenVector.push_back((token)); } } while (tokens); return tokenVector; } int main(int argc, char* argv[]) { std::string test = std::string("arne anka skulle gå på bio"); std::vector<std::string> tokens = splitString(test, ' '); std::cout << tokens.size() << std::endl; for (size_t i = 0; i < tokens.size(); i++) { std::cout << "token: " << tokens[i] << std::endl; } return 0; }