07. november 2000 - 20:04Der er
11 kommentarer og 1 løsning
Del en String op ??
Hejsa alle,
Nu har jeg i lang tid gået og tænkt over hvordan man kan dele en string op.. Et eksemple. jeg har en tekst som hedder \"Davs med dig\" Det jeg så gerne ville have at der skulle ske, er at den String deler sig. til 3 string eller noget ligne. String1 = Davs String2 = med String3 = dig
Bemærk at du ikke kan benytte strtok på statiske strenge (fx. strengen \"davs med dig\" i mit eksempel), da den overskriver strengen der benyttes som input. Det vil også sige, at din input streng bliver ødelagt af at kalde strtok. Du kan heller ikke benytte strtok i en multitrådet applikation, da den gemmer noget tilstand, som de enkelte tråde kommer til at overskrive.
I man-siden på linux er den første kommentar til strtok: never use this function! ...
Tak for svarende. Men jeg er igang med at lave en \"chat-server\" som skal reagere på 100(Get Nickname) og \"Zwonkie\" er nicknamet. og så lagere den så nicknamet i et eller andet som jeg ikke har fundet ud af endnu. Noget ligne sådan her:
if {første ord =100 så tag ord nr.2 som nickname =Zwonkie} Noget lignende.
Hvilken kode ville i så forslå ? (Håber i kan forstå min kryptiske spørgsmål, det er lidt svært at forklare ;-)
Hvorfor har du en kode og et navn i samme streng? Ville det ikke være nemmere, hvis de blev behandlet seperat? Nu er det jo også grebet ud af kontekst, jeg aner ikke hvordan dine ting ser ud, og hvorfor de gør det.
Men hvis du har 2 ord i din streng, hvor det første er en kode, og det andet et navn, så kan følgende bruges:
char* String=\"100 zwonkie\"; int Code; char* Name; Code=atol(String); Name=String; while (Name && *Name!=\' \') Name++;
if (!Name) printf(\"error! Name not found in string\"); else printf (\"Code is: %d Name is: %s\", Code, Name);
Men nu er det ikke for at virke utaknemlig, men jeg har fundet et Delphi Eksempel, som jeg synes er lidt smartere og bedre. Din kode virkede skam, og jeg vil bruge den kode, hvis jeg ikke kan lave den anden om til C++. Nå men, jeg har prøvet at skrive koden om til c++ (BCB4) og jeg er stødt på et lille problem. Det virker ikke !. Her er hvad jeg har lavet.
//--- C++ koden ---- AnsiString GetToken(AnsiString a,char *Sep, int Num)
{ AnsiString Token; AnsiString Result; int lenght; int TNum = 1; lenght = StrLen(a.c_str()); int TEnd = lenght;
if (TNum <= Num && TEnd < 0 && TEnd > 0) { TEnd=a.Pos(Sep); if (TEnd<0 && TEnd>0) { Token = a + TNum + TEnd-1; TNum = NULL; } else { Token=a; } if (TNum>=Num) { Result=Token.c_str(); } else { Result=\"\"; } } return Result; } //------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString text = Edit1->Text; if (GetToken(text,\" \",1) != \"100\") { Memo1->Lines->Add(\"Det dur vis du har skrevet 100\"); Memo1->Lines->Add(GetToken(text,\" \",1)); } }
//---- Delphi koden---- function TForm1.GetToken(a: string; Sep: Char; Num: Byte): string; var Token: string; StrLen:Byte; TNum:Byte; TEnd:Byte; begin strLen:=Length(a); TNum:=1; TEnd:=StrLen; while ((TNum<=Num) and (TEnd <> 0)) do begin TEnd:=Pos(Sep,a); if TEnd<>0 then begin Token:=Copy(a,1,TEnd-1); Delete(a,1,TEnd); Inc(TNum); end else Token:=a; end; if TNum>=Num then Result:=Token else Result:=\'\'; end;
Håber i kan hjælpe mig. Og undskyld at jeg er så \"krævene\". jeg skal nok add nogle flere points. Jeg håber at i kan bærer over med mig =)
Mange tak, DMK, For forslaget. men nu er jeg jo lidt af en Newbie så jeg kan ikke rigtig for dit eksemple til at virker. den kommer med de her fejl messages:
[C++ Error] Unit1.cpp(47): E2034 Cannot convert \'AnsiString\' to \'char *\'. [C++ Error] Unit1.cpp(47): E2343 Type mismatch in parameter \'Txt\' in call to \'GetToken(char *,char,int)\'. [C++ Error] Unit1.cpp(47): E2034 Cannot convert \'char *\' to \'char\'. [C++ Error] Unit1.cpp(47): E2343 Type mismatch in parameter \'Seperator\' in call to \'GetToken(char *,char,int)\'. [C++ Error] Unit1.cpp(50): E2034 Cannot convert \'AnsiString\' to \'char *\'. [C++ Error] Unit1.cpp(50): E2343 Type mismatch in parameter \'Txt\' in call to \'GetToken(char *,char,int)\'. [C++ Error] Unit1.cpp(50): E2034 Cannot convert \'char *\' to \'char\'. [C++ Error] Unit1.cpp(50): E2343 Type mismatch in parameter \'Seperator\' in call to \'GetToken(char *,char,int)\'.
Og her er den kode jeg har skrevet. (jeg har også dit eksempel ind i koden, men jeg vil bare ikke paste det med, da den ikke siger fejl)
45 { 46 AnsiString text = Edit1->Text; 47 if (GetToken(text,\" \",1) != \"100\") 48 { 49 Memo1->Lines->Add(\"Det dur vis du har skrevet 100\"); 50 Memo1->Lines->Add(GetToken(text,\" \",1)); 51 } 52 }
og kunne i ikke lige siger mig, hvad forskellen er mellem char og char* ?? ? Zwonkie
En char* er en pointer til en char, og opfattes som regel som en streng. Hvor godt er du inde i pointere, og brugen af pointere til at lave fx. arrays?
En char er blot en enkelt værdi, og kan derfor kun indeholde ét tegn. En char* er et array af værdier, og kan derfor indeholde mange tegn.
45 { 46 AnsiString text = Edit1->Text; 47 if (GetToken(text.c_str(),\' \',1) != \"100\") 48 { 49 Memo1->Lines->Add(\"Det dur vis du har skrevet 100\"); 50 Memo1->Lines->Add(GetToken(text.c_str(),\' \',1)); 51 } 52 }
Det skulle gerne løse dine errors. c_str() funktionen på AnsiString klassen returnerer en char*, så du kan tilgå strengen direkte. Og i C++ vil \" \" betyde en streng, mens \' \' betyder en enkelt værdi. Du kan derfor ikke angive en streng sådan: \'en streng\', og du kan ikke angive et enkelt tegn sådan: \" \".
Jeg siger mange tak, for alle forslagene, selvom det næsten kun kun var DMK, som svarede. Og han har sq også giver mig det rigtige svar. Mange DMK. Du for alle Pointsne.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.