Just nu i M3-nätverket
Jump to content

Strängkontroll


Blockqoute

Recommended Posts

Jag vill skriva ett kontrollprogram som skall läsa in två strängar och kontrollera och skriva ut om den första strängen finns i den andra.

 

Ex. Söksträng: vår

Skriv in en sträng: ärdetvårnu

Sträng 1 "vår" finns i sträng 2

 

Är det nån som har en idé på hur man kan göra det?

 

Link to comment
Share on other sites

jerker olofsson

du kan söka i en sträng med find metod i string-klassen.

 

size_type find(

value_type _Ch,

size_type _Off = 0

) const;

size_type find(

const value_type* _Ptr,

size_type _Off = 0

) const;

size_type find(

const value_type* _Ptr,

size_type _Off = 0,

size_type _Count

) const;

size_type find(

const basic_string& _Str,

size_type _Off = 0

) const;

 

Exempel:

#include <string>
#include <iostream>

std::string Str1( "ärdetvårnu" );
std::strign Str2( "vår" );

if( Str1.find( Str2 ) != std::string::npos ) {
 std::cout << "Strängen " << Str2 << " finns i strängen " << Str1 << "\n";
} else {
 std::cout << "Strängen " << Str2 << " finns inte i strängen " << Str1 << "\n";
}

 

Du läser som vanligt in strängar i C++ med getline:

template<class _E, class _TYPE, class _A> inline

basic_istream<_E, _TYPE>& getline(

basic_istream<_E, _TYPE>& Istream,

basic_string<_E, _TYPE, _A>& Xstring,

const _E _D=_TYPE::newline( )

);

.. förenklat ..

istream& getline( istream& in, string& out, char Delimiter = '\n' );

 

Exempel:

std::string Str1( "ärdetvårnu" );
std::string Str2; // Sök-strängen

// Läs in söksträngen från standard input (cin).
std::getline( std::cin, Str2 );

 

Lycka till.

 

Link to comment
Share on other sites

jerker olofsson

Vad för fördefinerade funktioner får du inte använda (i ditt skolarbete?).

 

Du kan inte läsa in en sträng från tangentbordet t ex utan att använda det.

 

Antingen så får du skriva din egen string-klass. Eller så får du skriva motsvarande c-stränghanteringsfunktioner.

 

Du kan börja med en strlen()-funktion.

Du loopar helt enkelt igenom arrayen tills du hittar en nolla, och kommer ihåg hur långt du loopat.

size_t strlen( const char* s ) {

const char* s2 = s;

while( *s2 != 0 ) ++s2;

return s2-s;

}

 

Sen kan det vara bra att ha en funktion för att kopiera strängar, den låter jag dig tänka ut själv.

 

Sen får du använda (antingen i din c++ string klass, eller rent) c-strängar. Dvs arrayer av typen char[] som avslutar/terminerar en sträng med en nolla.

 

Om du har en c sträng som är "Hej", så¨behövs 4 tecken.

['H', 'e', 'j', 0]

nollan behövs för att veta när strängen slutar.

 

En enkel string klass kan skrivas som följande:

class String {

private:

size_t Size_;

size_t Lenght_;

char* Data_;

public:

String() : Data_( new char[32] ), Size_( 32 ), Length_( 0 ) {}

 

String( const char* str ) :

Data_( new char[pstrlen(str)] ),

Size_( pstrlen(str) ),

Length_( pstrlen(str) )

{

::memcpy( Data_, str, pstrlen(str) );

}

 

void Append( const char* str ) {

size_t s = pstrlen( str );

 

size_t available = Size_-Length_-1;

 

if( available < s ) {

Resize( available+s );

}

::memcpy( Data_+Length_, str, s );

Length_ += s;

}

 

size_t length() {

return Size_;

}

 

const char* c_str() const {

return Data_;

}

 

private:

static size_t pstrlen( const char* s ) {

// Räkna ut längden på en c-string

const char* s2 = s;

while( *s2 != 0 ) ++s2;

return s2-s;

}

 

void Resize( size_t NewSize ) {

try {

char* NewData = new char[NewSize];

::memcpy( NewData, Data_, Length_ );

Data_ = NewData;

Size_ = NewSize;

} catch( ... ) { }

}

 

};

 

Osv.. Du får fortsätta själv, vill inte göra hela arbetet.

 

För att sedan kolla om en sträng finns i en annan sträng får du kolla tecken för tecken, och kolla om det matchar något tecken i sträng#2, om det matchar, så ska du fortsätta kolla, annars ska du sluta kolla.

 

 

 

[inlägget ändrat 2004-01-07 13:13:08 av jerker olofsson]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...