c++ - cannot convert string/char to char* vad betyder asterisken?

Permalänk
Medlem

c++ - cannot convert string/char to char* vad betyder asterisken?

Hej
Kan någon kolla min kod litegrann.
Den säger att den inte kan konvertera string till char*. Just den biten förstår jag, men om jag använder char istället för string så får jag cannot convert char to char*
Vad betyder den där asterisken?

/* \x86 : å \x84 : ä \x94 : ö \x8F : Å \x8E : Ä \x99 : Ö */ #include <iostream> #include <iomanip> #include <string> #include <fstream> #include <cmath> using namespace std; string GeneratePages(string TimsonMaskin, string Upplaga, string Ordernr, string Titel, string Ark, string Btj, string Pallnr){ string var; var = "<html><body><head><style type=\"text/css\">\n* {margin:0;padding:10px;border-collapse:collapse}\ntd {text-align:center;font-size:40px;font-weight:bold;font-family:helvetica, arial;vertical-align:top}\n.tdtop {text-align:left;border-top:#000 4px solid}\n.tdleft {border-right:#000 4px solid;border-top:#000 4px solid}\n.tdright {border-left:#000 4px solid;border-top:#000 4px solid}\n.text {font-size:110px;font-weight:bold;font-family:helvetica,arial}\n</style></head><table border=\"0\" width=\"800px\"><tr><td colspan=\"2\" style=\"height:350px;vertical-align:bottom;font-size:120px;font-weight:bold\">"; var += TimsonMaskin; var += "</td></tr><tr><td class=\"tdleft\">Upplaga<br><div class=\"text\">"; var += Upplaga; var += "</div></td><td class=\"tdright\">Ordernr<br><div class=\"text\">"; var += Ordernr; var += "</div></td></tr><tr><td colspan=\"2\" class=\"tdtop\">Titel<br><div class=\"text\">"; //.((strlen($titel<="12"))?$titel:substr($titel,0,12)."..."). int i; i = 0; while (Titel[i] != 0){ i++; } if(i<=12){ var += Titel; } else{ var += Titel.substr(0,12); var += "..."; } var += "</div></td></tr><tr><td class=\"tdleft\">Ark<br><div class=\"text\">"; var += Ark; var += "</div></td><td class=\"tdright\">BTJ<br><div class=\"text\">"; var += Btj; var += "</div></td></tr><tr><td class=\"tdleft\">Pall nr<br><div class=\"text\">"; var += Pallnr; var += "</div></td><td class=\"tdright\"></td></tr></table></body></html>"; return var; } int main(int argc, char *argv[]){ while (1) cout << "Bekr""\x84""fta varje rad med Enter\n"; cout << "Upplaga (exempel: 3580): "; string Upplaga; getline(cin,Upplaga); cout << "Ordernr (exempel: 65432): "; string Ordernr; getline(cin,Ordernr); cout << "Titel (exempel: Den lilla boken): "; string Titel; getline(cin,Titel); cout << "Ark (F""\x94""rsta arket, tex 1-7): "; //**************deklarering av Ark string Ark; getline(cin,Ark); cout << "BTJ: "; string Btj; getline(cin,Btj); cout << endl << "Du skrev in f""\x94""ljande: " << endl; cout << "Upplaga: " << Upplaga << endl; cout << "Ordernr: " << Ordernr << endl; cout << "Titel: " << Titel << endl; cout << "Ark: " << Ark << endl; cout << "BTJ: " << Btj << endl; cout << "St""\x84""mmer detta? " << "(j)a / (b)""\x94""rja om / (a)vsluta: "; string Koll; getline(cin,Koll); if (Koll == "j" || Koll == "J"){ cout << "Tack. " << "Genererar nu lapparna"; _sleep (1000); ofstream myfile ("fil.html"); if (myfile.is_open()){ int AntalHel; //Antal ark som får plats på en helbana AntalHel = 6000; int AntalHalv; //Antal ark som får plats på en halvbana AntalHalv = 12000; string TimsonMaskin; //Timson-maskin, Timson 1 510 eller Timson 2 520 TimsonMaskin = "Timson 2 520"; //Dela upp Ark med avgränsaren - och spara som vektor Result char Delim[] = "-"; char Result; Result = strtok(Ark,Delim); //**************Här ovan är felet int Mid; Mid = ceil(ArkB/2); for(int i=0;i<Mid;i++){ if(ArkA==ArkB){ AntalHel=AntalHalv; } for(int a=0;a<=ceil(Upplaga/AntalHel;a++)){ myfile << GeneratePages(TimsonMaskin,Upplaga,Ordernr,Titel,Ark,Btj,a); } } myfile.close(); } else{ cout << "Unable to open file"; _sleep (1000); } break; } else if (Koll == "b" || Koll == "B"){ //Börja om system("CLS"); } else if (Koll == "a"){ //Avsluta break; } else { //Börja om system("CLS"); } } return(0); }

Jag har fler fel i koden, det vet jag. Sen är inte allt så där optimalt kanske, men jag är väldigt mycket nybörjare på c++.

Tack på förhand
/Niclas

Permalänk
Medlem

Asterisken betyder pekare. Om man försöker tilldela ett objekt till en pekare eller vice versa klagar kompilatorn. För att få en pekare till ett objekt kan du sätta ett "&" framför. För att få objektet som en pekare pekar på kan du använda "*" framför för att avreferera den.

Ex:

char c; char *pC; pC = c; funkar ej pC = &c; bör funka. c = pC; funkar ej c = *pC; bör funka

(Är dock nybörjare jag också så jag är inte helt säker...)

Permalänk
Medlem

Ujuj, generera webbsidor för hand med cout och dessutom i C++. Du gillar smärta, eller hur?

Visa signatur

OSIRIS GUITAR - youtube-kanal om elgitarrer, mixning och teknik i hemmastudio

Permalänk
Medlem

osiris8: hur föreslår du att jag gör istället?

Permalänk
Medlem

Jag föreslår att du tittar på något av de webbramverk som finns. Om du tycker att objektorientering är viktigt så föreslår jag asp.net med c# (vilket kanske inte är så aktuellt i ditt fall - militant macanvändare ) eller java . Annars något interpreterat som php eller något mellanting som ruby on rails.

Visa signatur

OSIRIS GUITAR - youtube-kanal om elgitarrer, mixning och teknik i hemmastudio

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av osiris8

Jag föreslår att du tittar på något av de webbramverk som finns. Om du tycker att objektorientering är viktigt så föreslår jag asp.net med c# (vilket kanske inte är så aktuellt i ditt fall - militant macanvändare ) eller java . Annars något interpreterat som php eller något mellanting som ruby on rails.

Du har missat lite vad det är han vill göra. Han vill inte skriva en hemsida som så, han vill göra detta:
http://www.sweclockers.com/forum/showthread.php?s=&threadid=6...

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Ah jag förstår (var inte så lätt att fatta av alla <html>, <tr> och <td> i koden).

Visa signatur

OSIRIS GUITAR - youtube-kanal om elgitarrer, mixning och teknik i hemmastudio

Permalänk
Medlem

Problemet är funktionen strtok. Den tar 2 st char* som argument, men du skickar med en string som första argument. Trevligt nog har string-klassen en funktion som fixar detta, så ändra raden till:

Result = strtok(Ark.c_str(),Delim);

så ska det funka (iaf den raden, resten av koden orkade jag inte titta på ).

Permalänk
Medlem

Det verkade inte fungera heller

Result = strtok(Ark.c_str(),Delim);

Gav
92 C:\Dev-Cpp\Projekt\main.cpp invalid conversion from `const char*' to `char*'
92 C:\Dev-Cpp\Projekt\main.cpp initializing argument 1 of `char* strtok(char*, const char*)'
92 C:\Dev-Cpp\Projekt\main.cpp invalid conversion from `char*' to `char'

/Niclas

Permalänk

Så här då?

Result = strtok(&Ark.c_str(),Delim);

Om det inte funkar skyller jag på att jag inte läst koden du postat ordentligt....

Permalänk
Medlem

Ok, såhär funkar strtok():
Den är deklarerad såhär (iaf i min C-bok):

char* strtok(char *str, const char *delim)

Den är lite krånglig att använda, men ska försöka illustrera det i ett exempel:

char str[] = "Kalle-Anka-Musse-Pigg"; char delim[] = "-"; char *result = strtok(str, delim); while (result != NULL) { printf("%s\n", result); result = strtok(NULL, delim); }

Första gången vi kör strtok skickar vi med str och delim. strtok kommer då leta igenom str tills den hittar ett '-' och ändrar det till '\0', sätter en intern statusvariabel att peka på tecknet som kommer efter första '-' och returnerar slutligen en pekare till första tecknet i str. Hittar den inget '-' returnerar den NULL, därför kollar vi det i while-loopen.

I loopen skriver vi sen ut den första biten (strtok ändrade ju '-' till '\0', så bara "Kalle" skrivs ut), sen kör vi strtok igen, men skickar inte med str denna gång (utan låter strtok starta från sin interna statusvariabel). Vi fortsätter så tills det inte finns fler '-'. Efter den här kodbiten kommer alltså str vara "Kalle\0Anka\0Musse\0Pigg" och på skärmen har skrivits ut:

Kalle Anka Musse Pigg

Jag vet inte riktigt vad det är du vill göra med strtok i programmet, men om du vill plocka ut delar av strängen Ark och lägga dem i en lista måste du alltså köra strtok i en while-loop, varje gång skapa ett string-objekt av den char* som strtok returnerar, och sen lägga dessa i en vector eller liknande.

Jag skulle dock rekommendera att du tittar i din C++-bok eller söker på nätet om hur du kan göra detta enbart med string-klassen och dess metoder istället för att blanda in gamla svåranvända C-funktioner och typer.

Permalänk
Medlem

okej, då testar jag att göra en egen explode-funktion
Jag gjorde först detta i php och det fungerar precis som jag vill ha det:

<?php $str="1421-53523"; function explodea($delimit,$str){ for($i=0;$i<=strlen($str);$i++){ if($str[$i]!="-"){ $a.=$str[$i]; } elseif($str[$i]==$delimit){ $s[]=$a; $a=""; } } $s[]=$a; return $s; } print_r(explodea("-",$str)); ?>

Sedan försökte jag göra om det till c++ men då stötte jag på ett fel:

string Explode(string Str, string Delim){ string A=""; string S[2]; for(int i=0;i<=Str.length();i++){ if(&Str[i] != Delim){ A+=Str[i]; } else if(&Str[i]==Delim){ S[0]=A; A=""; } } S[1]=A; return S; }

Felet är 31 C:\Dev-Cpp\Projekt\main.cpp conversion from `std::string*' to non-scalar type `std::string' requested
Och det motsvarar sists raden med "return S;".

Någon som vet felet?

/Niclas

Permalänk
Citat:

Ursprungligen inskrivet av skorpion

Sedan försökte jag göra om det till c++ men då stötte jag på ett fel:

string Explode(string Str, string Delim){ string A=""; string S[2]; for(int i=0;i<=Str.length();i++){ if(&Str[i] != Delim){ A+=Str[i]; } else if(&Str[i]==Delim){ S[0]=A; A=""; } } S[1]=A; return S; }

Felet är 31 C:\Dev-Cpp\Projekt\main.cpp conversion from `std::string*' to non-scalar type `std::string' requested
Och det motsvarar sists raden med "return S;".

Någon som vet felet?

/Niclas

Du jämför sträng med en pekare till en sträng ..

if(&Str[i] != Delim) {

ska vara

if(Str[i] != Delim) {

Du har det på två ställen.

Permalänk
Medlem

Okej, det var fel på just if-satsen först, jag testad erunt loite och satte dit & och då fungerade det ända tills return.
Om koden ser ut såhär

string Explode(string Str, string Delim){ for(int i=0;i<=Str.length();i++){ if(Str[i] != Delim){ string A+=Str[i]; } else if(Str[i]==Delim){ string S[0]=A; A=""; } } S[1]=A; return S; }

så får jag felet:
20 C:\Dev-Cpp\Projekt\main.cpp no match for 'operator!=' in '(&Str)->std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT="char," _Traits="std::char_traits<char>," _Alloc="std::allocator<char>"](((unsigned int)i)) != Delim'
21 C:\Dev-Cpp\Projekt\main.cpp expected primary-expression before "A"
21 C:\Dev-Cpp\Projekt\main.cpp expected `;' before "A"
23 C:\Dev-Cpp\Projekt\main.cpp no match for 'operator==' in '(&Str)->std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT="char," _Traits="std::char_traits<char>," _Alloc="std::allocator<char>"](((unsigned int)i)) == Delim'
24 C:\Dev-Cpp\Projekt\main.cpp `A' undeclared (first use this function)
28 C:\Dev-Cpp\Projekt\main.cpp `S' undeclared (first use this function)

??
/Niclas

Permalänk
Medlem
Citat:

så får jag felet:
20 C:\Dev-Cpp\Projekt\main.cpp no match for 'operator!=' in '(&Str)->std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT="char," _Traits="std::char_traits<char>," _Alloc="std::allocator<char>"](((unsigned int)i)) != Delim'

Du kan inte jämföra en string med en char...

Citat:

21 C:\Dev-Cpp\Projekt\main.cpp expected primary-expression before "A"
21 C:\Dev-Cpp\Projekt\main.cpp expected `;' before "A"

Var har du deklarerat A?...

Citat:

23 C:\Dev-Cpp\Projekt\main.cpp no match for 'operator==' in '(&Str)->std::basic_string<_CharT, _Traits, _Alloc>::operator[] [with _CharT="char," _Traits="std::char_traits<char>," _Alloc="std::allocator<char>"](((unsigned int)i)) == Delim'

Som sagt, inte jämföra string med char...

Citat:

24 C:\Dev-Cpp\Projekt\main.cpp `A' undeclared (first use this function)
28 C:\Dev-Cpp\Projekt\main.cpp `S' undeclared (first use this function)

Du måste deklarera dina variabler...

Köp en bra bok och läs in kunskaper om C/C++. Ex: bjarne

Visa signatur

[ Adopt, Adapt and Apply ]

Permalänk
Medlem

string Explode(string Str, string Delim){ for(int i=0;i<=Str.length();i++){ if(Str[i] != Delim){ string A+=Str[i]; } else if(Str[i]==Delim){ string S[0]=A; A=""; } } S[1]=A; return S; }

Några olika fel:
Du har deklarerat funktionen att returnera en string när du egentligen vill returnera en array av strängar.

Som någon annan redan påpekat, du kan inte jämföra en char med en string, alltså ska Delim deklareras char istället (och när du anropar funktionen gör du det med '-' istället för "-").

Du kan inte deklarera A och S inne i if-satserna, de måste vara deklarerade innan for-satsen om de ska vara synliga efter att for-satsen är färdig.

Och till sist, arrayer i C++ är inte som arrayer i PHP, håll dig undan dem om du inte säkert vet att du behöver använda dem. Vad du vill använda är en vector, så omskrivet skulle din funktion kunna se ut såhär (tog mig friheten att döpa om A och S till tmp och result ):

#include <string> #include <vector> using namespace std; vector<string> explode(string str, char delim) { vector<string> result; string tmp = ""; for (int i = 0; i < str.size(); ++i) { if (str[i] != delim) tmp += str[i]; else { if (tmp.size()) result.push_back(tmp); tmp = ""; } } if (tmp.size()) result.push_back(tmp); return result; }

Slutligen är det här inte det effektivaste sättet att dela upp en sträng, string-klassen har metoder find och substr du kan använda för att slippa stega igenom strängen en bokstav i taget. Typ något så här:

vector<string> explode(string str, char delim) { vector<string> result; string::size_type begin = 0, end = 0; while ((end = str.find_first_of(delim, end)) != string::npos) { if (end - begin) result.push_back(str.substr(begin, end - begin)); begin = ++end; } if (end - begin) result.push_back(str.substr(begin, end - begin)); return result; }