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

Tablice dynamiczne

Ostatnio zmodyfikowano 2014-03-11 16:22
Autor Wiadomość
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.

C/C++
#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;
}
P-105984
Monika90
» 2014-03-10 14:02:04
A czy możesz jaśniej? 10000 znaków, 10000 wierszy?
Może tak
C/C++
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';
P-105987
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.
P-105988
Adik80
» 2014-03-10 14:21:55
Jelsi mozesz uzywac np. vektora:
C/C++
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:

C/C++
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 );
P-105989
Monika90
» 2014-03-10 14:21:58
Mogę tylko użyć fgets.
A to dlaczego?

Zaimplementuj własne fread za pomocą fgets. Albo za pomocą fgetc.
P-105990
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)
C/C++
#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 );
}
P-105995
Adik80
» 2014-03-10 14:54:42
Sa dwie deklaracje "wskaznik" i zapomnialem ze malloc/realloc zwracaja void*. Zobacz czy teraz zadziala:

C/C++
#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 );
}


P-105998
Midas
Temat założony przez niniejszego użytkownika
» 2014-03-10 15:35:50
..
P-106003
« 1 » 2
  Strona 1 z 2 Następna strona