Midas Temat założony przez niniejszego użytkownika |
Tablice dynamiczne » 2014-03-10 13:00:14 Witam, chciałbym napisać program który wczyta dowolną liczbę wierszy tekstu typu char < 10000, następnie je wyświetli. Nie wiem jaki warunek dać żeby pętla się skończyła i żebym mógł wypisać tekst. Nie mogę używać stringów. #include <iostream> #include <conio.h> using namespace std;
int main( int argc, char ** argv ) { int temp = 0; char * wskaznik, tab[ 10000 ]; while( true ) { fgets( tab, sizeof( tab ), stdin ); wskaznik = new char[ 10000 ]; memcpy( wskaznik, tab, sizeof( tab ) ); temp++; } for( int c = 0; c <= temp; c++ ) { cout << tab[ c ] << endl; } delete wskaznik; return 0; } |
|
Monika90 |
» 2014-03-10 14:02:04 A czy możesz jaśniej? 10000 znaków, 10000 wierszy? Może tak char tab[ 10001 ]; size_t sz = fread( tab, 1, sizeof( tab ) - 1, stdin ); tab[ sz ] = '\0'; cout << "wczytano " << sz << " znakow, oto one\n" << tab << '\n';
|
|
Midas Temat założony przez niniejszego użytkownika |
» 2014-03-10 14:17:11 10000 znaków w jednej linii. Muszę to zrobić bez używania fread. Mogę tylko użyć fgets. |
|
Adik80 |
» 2014-03-10 14:21:55 Jelsi mozesz uzywac np. vektora: std::vector < char *> linie; while( 1 ) { fgets( tab, sizeof( tab ), stdin ); int slen = strlen( tab ); if( slen <= 1 ) break; char * temp = new char[ slen + 1 ]; strncpy( temp, tab, slen ); linie.push_back( temp ); }
for( std::vector < char *>::iterator it = linie.begin(); it < linie.end(); ++it ) { std::cout <<* it; delete[] * it; } Jesli tylko za pomoca wskaznikow: char ** wskaznik = 0; int size = 0; int allocated = 0; while( 1 ) { fgets( tab, sizeof( tab ), stdin ); int slen = strlen( tab ); if( slen <= 1 ) break; if( size + 1 >= allocated ) { allocated += 10; wskaznik = realloc( wskaznik, allocated * sizeof( char * ) ); } wskaznik[ size ] = malloc( slen + 1 ); strncpy( wskaznik[ size++ ], tab, slen ); }
for( int i = 0; i < size; ++i ) { printf( "%s", wskznik[ i ] ); free( wskaznik[ i ] ); } free( wskaznik ); |
|
Monika90 |
» 2014-03-10 14:21:58 A to dlaczego? Zaimplementuj własne fread za pomocą fgets. Albo za pomocą fgetc. |
|
Midas Temat założony przez niniejszego użytkownika |
» 2014-03-10 14:40:19 Adik, kod który podałeś nie chce mi zadziałać(wskaźniki) #include <iostream> #include <conio.h> using namespace std;
int main() { char * wskaznik, tab[ 10000 ]; char ** wskaznik = 0; int size = 0; int allocated = 0; while( 1 ) { fgets( tab, sizeof( tab ), stdin ); int slen = strlen( tab ); if( slen <= 1 ) break; if( size + 1 >= allocated ) { allocated += 10; wskaznik = realloc( wskaznik, allocated * sizeof( char * ) ); } wskaznik[ size ] = malloc( slen + 1 ); strncpy( wskaznik[ size++ ], tab, slen ); } for( int i = 0; i < size; ++i ) { printf( "%s", wskaznik[ i ] ); free( wskaznik[ i ] ); } free( wskaznik ); } |
|
Adik80 |
» 2014-03-10 14:54:42 Sa dwie deklaracje "wskaznik" i zapomnialem ze malloc/realloc zwracaja void*. Zobacz czy teraz zadziala: #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char tab[ 10000 ]; char ** wskaznik = 0; int size = 0; int allocated = 0; while( 1 ) { fgets( tab, sizeof( tab ), stdin ); int slen = strlen( tab ); if( slen <= 1 ) break; if( size + 1 >= allocated ) { allocated += 10; wskaznik =( char ** ) realloc( wskaznik, allocated * sizeof( char * ) ); } wskaznik[ size ] =( char * ) malloc( slen + 1 ); strncpy( wskaznik[ size++ ], tab, slen ); } for( int i = 0; i < size; ++i ) { printf( "%s", wskaznik[ i ] ); free( wskaznik[ i ] ); } free( wskaznik ); } |
|
Midas Temat założony przez niniejszego użytkownika |
» 2014-03-10 15:35:50 .. |
|
« 1 » 2 |