Avatar billede zwonkie Nybegynder
07. november 2000 - 20:04 Der 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

Kan i hjælpe mig med det ?
Avatar billede jackonlinux Nybegynder
07. november 2000 - 20:37 #1
Vil du ha\' syntaksen? Eller på dansk?

Der findes garanteret en streng funktion, som kan gøre det for dig.



Avatar billede stigc Nybegynder
07. november 2000 - 20:40 #2
char s[] = \"dette er en test\";
cahr* p;

p= strtok(s, \" \");

while(p) {

cout<< p << \" \";
p=strtok(NULL, \" \");

}
Avatar billede stigc Nybegynder
07. november 2000 - 20:41 #3
#include <string.h>
Avatar billede jackonlinux Nybegynder
07. november 2000 - 21:07 #4
A i Ansi C++ <string> >> uden h


Avatar billede dmk Nybegynder
08. november 2000 - 10:14 #5
Hvis du kender antallet af del-strenge, kan du også benytte:

char Part1[20], Part2[20], Part3[20];
char* String=\"Davs med dig\";

sscanf(String, \"%s %s %s\", Part1, Part2, Part3);

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! ...

Venligst,
DMK

Avatar billede zwonkie Nybegynder
08. november 2000 - 17:14 #6
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 ;-)

Zwonkie
Avatar billede dmk Nybegynder
09. november 2000 - 09:35 #7
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);

Jeg håber du forstår eksemplet.

Venligst,
DMK
Avatar billede zwonkie Nybegynder
09. november 2000 - 22:20 #8
OK, mange tak DMK.

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 =)
Avatar billede dmk Nybegynder
10. november 2000 - 10:21 #9
Hej igen

TEnd=a.Pos(Sep);

Hvad gør pos-funktionen?

if (TEnd<0 && TEnd>0)

Det kan da vist ikke lade sig gøre! Dette udsagn giver, efter min bedste overbevisning, altid false.


AnsiString GetToken(char* Txt, char Seperator, int TokenNum)
{
char* tmp=Txt;
int Num=1;
while (Num<TokenNum)
{
while (tmp && *tmp!=Seperator) tmp++;
if (!tmp) break;
tmp++;
Num++;
}
if (Num!=TokenNum)
{
// Error handling: Token not found
  return;
}
char *tmp2=tmp;
while (tmp2 && *tmp2!=Seperator) tmp2++;
*tmp2=0x00;
AnsiString ReturnString=tmp;
*tmp2=Seperator; // Restore original string
return ReturnString;
}

Det skulle vist gerne virke.

DMK
Avatar billede zwonkie Nybegynder
13. november 2000 - 19:45 #10
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)\'.

void __fastcall TForm1::Button1Click(TObject *Sender)

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
Avatar billede dmk Nybegynder
14. november 2000 - 10:02 #11
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: \" \".

DMK

Avatar billede zwonkie Nybegynder
14. november 2000 - 19:36 #12
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.

Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester