dzielenie tablicy char
Ostatnio zmodyfikowano 2016-11-30 09:57
Maverick Temat założony przez niniejszego użytkownika |
dzielenie tablicy char » 2016-11-29 17:13:20 Witam, napotkałem problem podczas pisania kodu który podzieli tekst z tablicy char na wyrazy które następnie wsadzi do osobnych tablic typu char. Wie ktoś co dalej zrobić? #include<iostream> using namespace std;
unsigned podziel_napis() { string tekst; unsigned n; char znak= {' '}; char *zrodlowy = "Ala ma kota"; char *wsk = zrodlowy;
char** napisy = new char*[3];
for(int i=0; i<3; i++) { napisy[3]=wsk; } } int main() { podziel_napis(); return 0; } Ps: jak zrobić ramkę na kod która jest na tym forum używana? |
|
krainamodu |
» 2016-11-29 19:03:27 Ja bym to tak zrobił #include<iostream> using namespace std;
void podziel_napis1( char tab1[], char tab2[], int k ) { char zrodlo[] = "Ala ma kota"; cout << zrodlo << endl; for( auto i = 0; i < k; i++ ) { tab1[ i ] = zrodlo[ i ]; } tab1[ k ] = '\0'; int j = 0; for( auto i = k; i < 11; i++ ) { tab2[ j++ ] = zrodlo[ i ]; } tab2[ 11 - k ] = NULL; } int main() { int k; char * tab1, * tab2; cout << "Po ktorym znaku podzielic?" << endl; cin >> k; tab1 = new char[ k + 1 ]; tab2 = new char[ 11 - k + 1 ]; podziel_napis1( tab1, tab2, k ); cout << tab1 << endl; cout << tab2 << endl; delete tab1; delete tab2; return 0; } kod wstawiamy w [cpp.][/cpp.] bez kropek. kurs o ciągach znaków: http://cpp0x.pl/kursy/Kurs-C++/Ciagi-znakow-lancuchy/299 |
|
j23 |
» 2016-11-29 20:44:46 char znak = ' '; const char * zrodlowy = "Ala ma kota"; const char * p1 = zrodlowy; const char * p2 = p1;
while( * p1 != '\0' ) { while( * p2 != 0 && * p2 != znak ) ++p2; size_t n = p2 - p1; char * p3 = new char[ n + 1 ]; strncpy( p3, p1, n ); p3[ n ] = '\0'; ... while( * p2 != 0 && * p2 == znak ) ++p2; p1 = p2; }
|
|
Gibas11 |
» 2016-11-29 20:47:30 Takie coś mi wyszło, ale nie lubię takiego mieszanego C i C++. #include <iostream> #include <cstring> #include <string>
size_t getWords( char ** words, const char * input, const unsigned maxWordCount, const unsigned maxWordSize ) { if( !maxWordCount ) return 0; std::string inputString( input ); size_t lastWordPos = 0; size_t wordCount = 0; for( auto i = 0u; i < inputString.size() && wordCount < maxWordCount; ++i ) { if( !std::isalnum( inputString[ i ], std::locale( "" ) ) ) { auto tmp = inputString.substr( lastWordPos, i - lastWordPos ); while( tmp.size() > 0 && !std::isalnum( tmp.front(), std::locale( "" ) ) ) tmp.erase( tmp.begin() ); if( tmp.size() > maxWordSize ) tmp = tmp.substr( 0, maxWordSize ); if( tmp.size() == 0 ) continue; std::strcpy( words[ wordCount ], tmp.c_str() ); ++wordCount; lastWordPos = i; } } return wordCount; }
int main() { const auto maxWordCount = 30u; const auto maxWordSize = 10u; char * output[ maxWordCount ]; for( auto i = 0u; i < maxWordCount; i++ ) output[ i ] = new char[ maxWordSize ]; char input[] = "Ala ma co? Kotka!"; auto foundCount = getWords( output, input, maxWordCount, maxWordSize ); for( auto i = 0u; i < foundCount; ++i ) { std::cout << i + 1 << " → " << output[ i ] << std::endl; } for( auto i = 0u; i < maxWordCount; i++ ) delete output[ i ]; }
|
|
mokrowski |
» 2016-11-30 09:57:07 Inni udzielili Ci odpowiedzi bezpośredniej. Jeśli jednak nie jest to _absolutnie_ konieczne, unikaj pracy na "surowych" tablicach char. To stwarza okazję do popełnienia wielu błędów. Poniżej rozwiązanie bez tablic a z typem vector oraz typem string a nie surowymi ciągami znaków kończonych zerem. #include <iostream> #include <string> #include <sstream> #include <algorithm> #include <iterator> #include <vector>
using namespace std;
vector < string > split_word( const string & words ) { vector < string > word_vector; istringstream stream( words ); copy( istream_iterator < string >( stream ), istream_iterator < string >(), back_inserter( word_vector ) ); return word_vector; }
int main() { string words { "Ala ma kota" }; auto words_vec = split_word( words ); for( const auto & word: split_word( words ) ) { cout << word << endl; } }
|
|
« 1 » |