Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

dzielenie tablicy char

Ostatnio zmodyfikowano 2016-11-30 09:57
Autor Wiadomość
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?
P-154282
» 2016-11-29 19:03:27
Ja bym to tak zrobił
C/C++
#include<iostream>
using namespace std;

void podziel_napis1( char tab1[], char tab2[], int k )
{
    char zrodlo[] = "Ala ma kota"; //11 znakow
    cout << zrodlo << endl;
    for( auto i = 0; i < k; i++ )
    {
        tab1[ i ] = zrodlo[ i ];
    }
    tab1[ k ] = '\0'; //koniec łańcucha oznaczamy '\0' lub NULL
    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
P-154285
» 2016-11-29 20:44:46
C/C++
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';
   
    /* w p3 wskazuje na kolejne słowa */
    ...
   
    while( * p2 != 0 && * p2 == znak ) ++p2;
   
    p1 = p2;
   
}
P-154292
» 2016-11-29 20:47:30
Takie coś mi wyszło, ale nie lubię takiego mieszanego C i C++.
C/C++
#include <iostream>
#include <cstring>
#include <string>

size_t getWords( char ** words, const char * input, const unsigned maxWordCount, const unsigned maxWordSize ) {
    /* Że zero słówek? ;-;*/
    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 ];
   
}
P-154294
» 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.
C/C++
#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;
    }
}
P-154327
« 1 »
  Strona 1 z 1