Avatar billede natashaelina Nybegynder
25. januar 2005 - 12:51 Der er 6 kommentarer

Indlæse en streng - karakter for karakter

Synes lige jeg ville give flere point

Jeg er ifærd med at overloade >> operatoren således at den kan tage et objekt at typen mystring (streng klasse)
-    men hvilken kode skal jeg bruge for at få læst en fra keyboardet indtastet streng ind, når de enkelte karakterer skal læses en af gangen og tilføjes til enden af strengen.

Dertil skal det parameter overførte target objekt før indlæsningen sættes til en tom streng

Funktionen må ikke være medlemsfunktion eller friend.
Følgende er medlemsfunktioner -
En overloaded Subscript operatoren (return sequence[position])
Og en overloaded += operatoren - void mystring::operator +=(char addend)

Er der en der kan hjælpe mig med at udfylde nedstående?


std::istream& operator >>(std::istream& ins, mystring& target)
{
  size_t i,j=0;

// ignorer al whitespace før streng
while(ins && isspace(ins.peek()))
      ins.ignore();


Target sættes til tom streng ?

  while(ins && !((isspace(ins.peek()))|| ins.peek()==EOF))
  {
            ??????????????
  }

  return ins;
}

Jeg skulle mene at den overloadede subscript / [] operator (return sequence[position]) ville give adgang til det instantierede objekt, i hvis char array tekststrengen fra indput strømmen skal ind ? – og derfor kan anvendes i denne forbindelse??.

Eller er der brug for en ekstra funktion der tilgår streng objektets char array ?

Mvh NatashaElina
Avatar billede natashaelina Nybegynder
25. januar 2005 - 14:07 #1
selv kommentar

jeg kan forstå at den letteste måde at assigne en værdi til en streng er igennem
strcpy(char target[], const char source[])
Avatar billede bertelbrander Novice
25. januar 2005 - 20:31 #2
Jeg er ikke sikker på at det er det du er ude efter, men man kunne starte med:

#include <iostream>
#include <ctype.h>

class Whatever
{
public:
  char & operator[] (int aIdx)
  {
      return Array[aIdx];
  }
  const char *c_str() const  { return Array; }

private:
  char Array[1024];
};

std::istream &operator >> (std::istream &ins, Whatever &aWhatever)
{
  int n = 0;
  while(ins && !((isspace(ins.peek())) || ins.peek() == ins.eof()))
  {
      aWhatever[n++] = ins.get();
  }
  aWhatever[n] = 0;

  return ins;
}

int main()
{
  std::cout << "Type something: ";
  Whatever What;
  std::cin >> What;
  std::cout << "You typed: " << What.c_str() << std::endl;
}

Bemærk at den venter på at du trykker enter (eller rettere at den læser en newline).
Man kan ikke gøre det anderledes med standard C++ (eller C) men der findes platform specifikke måder at gøre det på, hviken kompiler og platform bruger du?
Avatar billede natashaelina Nybegynder
26. januar 2005 - 14:51 #3
tak den virker!

Min platform er windows 2000 prof. og compileren er C++ Builderen version 5.0(Build 12.34)

Var dog ikke helt det jeg skulle bruge, skyldes mine mangelfulde oplysninger og klarhed - men det var det jeg også gerne ville have!
Jeg fandt svaret på hvorfor jeg ikke kunne få følgende kode til at
virke

ins.get(c);
target[j++]=c;

en overloadede subscript operator som const funktion uden en reference return type - tillader ikke megen ændring af et objektet.

fandt også ud af at min opgave var at anvende en overloaded += til at indlæse
den af get funktionen læste char

tak for hjælpen
Avatar billede natashaelina Nybegynder
28. januar 2005 - 10:13 #4
Bertel
Kunne du lige forklare mig hvorfor man kun behøver at levere adressen til et streng objekt for at få dens array udskrevet? - det må jo næsten være en funktionalitet der
allerede er implemteret i <iostream>
Avatar billede bertelbrander Novice
28. januar 2005 - 20:43 #5
Et array og en pointer er næsten det samme i C og C++. Man kan ikke overføre arrays til funktioner og operatorer, kun pointere og referencer.

ostream kan udskrive std::string og const char * De sidste skal være 0-terminerede.

I min kode ovenfor er det char * metoden til udskrivning der bruges, den vil udskrive indtil den møder en char med værdien 0, derfor afslutter jeg med en aWhatever[n] = 0; i >> operatoren.
Avatar billede natashaelina Nybegynder
04. februar 2005 - 14:01 #6
Jeg skulle have sagt tak på forhånd, men du får istedet en stor tak på baghånd
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