Entra

View Full Version : [C++]Dubbio matrici


-Yara-
13-01-2005, 15:10
Salve a tutti,
ho appena fatto il seguente programma:


#include <iostream.h>
#include <stdio.h>

int main()
{
const int righe=5,colonne=20; //crea una matrice da 5 righe e 20 colonne; le colonne sono le lettere
char matrice[righe][colonne],scelta;
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire la parola di posto "<<i<<endl;
gets(matrice[i]);
}

do
{
cout<<"Desideri vedere la matrice? "<<endl;
cin>>scelta;
}while(scelta!='s');

if(scelta=='s')
{
for(i=0;i<righe;i++)
{
cout<<matrice[i]<<" ";
}
}
getchar();
}


Me lo compila correttamente e funziona, ma c++ mi da un warning:

In file included from /usr/include/c++/3.3.2/backward/iostream.h:31,
from stringhe_matrici.cpp:1:
/usr/include/c++/3.3.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
stringhe_matrici.cpp:29:10: warning: no newline at end of file
/home/antonio/tmp/ccSqqUJT.o(.text+0x8c): In function `main':
: warning: the `gets' function is dangerous and should not be used.

In particolare l'ultimo in grassetto :confused:

:confused:

Ziosilvio
13-01-2005, 15:27
Originariamente inviato da -Yara-
Me lo compila correttamente e funziona, ma c++ mi da un warning:

In file included from /usr/include/c++/3.3.2/backward/iostream.h:31,
from stringhe_matrici.cpp:1:
/usr/include/c++/3.3.2/backward/backward_warning.h:32:2: warning: #warning
This file includes at least one deprecated or antiquated header.
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard.
Examples include substituting the <X> header for the <X.h> header for C++ includes,
or <sstream> instead of the deprecated header <strstream.h>.
To disable this warning use -Wno-deprecated.
Significa che mescoli funzioni "buone" con funzioni deprecate, cioe' che andrebbero sostituite con altre funzioni piu' recenti e "migliori".
Probabilmente si riferisce al fatto che mescoli input-output in stile C++ (iostream.h) e in stile C (stdio.h).
Inoltre, ti dice che se non vuoi che ti dia questo messaggio di avviso, devi passare il parametro -Wno-deprecated a gcc quando lo lanci.
stringhe_matrici.cpp:29:10: warning: no newline at end of file
Stai per caso usando emacs per scrivere il programma?
Perche' questo editor ha l'abitudine di non aggiungere automaticamente un carattere di fine riga alla fine di un file di testo.
Roba che si corregge in un attimo, comunque.
/home/antonio/tmp/ccSqqUJT.o(.text+0x8c): In function `main':
: warning: the `gets' function is dangerous and should not be used.

In particolare l'ultimo in grassetto
L'ultima in grassetto si spiega da sola: gets e' una delle funzioni fatte peggio nella libreria standard del C, provoca un sacco di problemi di sicurezza aprendo la porta a buffer overflow, e andrebbe sostituita con funzioni omologhe ma che facciano un controllo sul numero di caratteri della stringa di input, ad esempio fgets.

-Yara-
13-01-2005, 15:54
Ti ringrazio.
Ho messo fgets, pero':

In file included from /usr/include/c++/3.3.2/backward/iostream.h:31,
from stringhe_matrici.cpp:1:
/usr/include/c++/3.3.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
/usr/include/stdio.h: In function `int main()':
/usr/include/stdio.h:526: error: too few arguments to function `char* fgets(char*, int, FILE*)'
stringhe_matrici.cpp:12: error: at this point in file
stringhe_matrici.cpp:31:10: warning: no newline at end of file


Cosa vuol dire?

:confused:

P.S. Come editor uso Kwrite

-Yara-
13-01-2005, 18:14
UP

beppegrillo
13-01-2005, 18:26
Originariamente inviato da -Yara-


Cosa vuol dire?

:confused:

P.S. Come editor uso Kwrite
Vuol dire che sbagli a passargli gli argomenti, facci vedere come chiami fgets.

-Yara-
13-01-2005, 19:25
Originariamente inviato da beppegrillo
Vuol dire che sbagli a passargli gli argomenti, facci vedere come chiami fgets.

Guarda, non ho ancora fatto le funzioni, cmq:

#include <iostream.h>
#include <stdio.h>

int main()
{
const int righe=5,colonne=20; //crea una matrice da 5 righe e 20 colonne; le colonne sono le lettere
char matrice[righe][colonne],scelta;
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire la parola di posto "<<i<<endl;
fgets(matrice[i]);
}

do
{
cout<<"Desideri vedere la matrice? "<<endl;
cin>>scelta;
}while(scelta!='s');

if(scelta=='s')
{
for(i=0;i<righe;i++)
{
cout<<matrice[i]<<" ";
}
}
getchar();
}

:sofico:

beppegrillo
13-01-2005, 20:20
Originariamente inviato da -Yara-
Guarda, non ho ancora fatto le funzioni, cmq:

#include <iostream.h>
#include <stdio.h>

int main()
{
const int righe=5,colonne=20; //crea una matrice da 5 righe e 20 colonne; le colonne sono le lettere
char matrice[righe][colonne],scelta;
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire la parola di posto "<<i<<endl;
fgets(matrice[i]);
}

do
{
cout<<"Desideri vedere la matrice? "<<endl;
cin>>scelta;
}while(scelta!='s');

if(scelta=='s')
{
for(i=0;i<righe;i++)
{
cout<<matrice[i]<<" ";
}
}
getchar();
}

:sofico:

Ma fgets stà per file gets, io non vedo nessun file..

-Yara-
13-01-2005, 20:23
Originariamente inviato da beppegrillo
Ma fgets stà per file gets, io non vedo nessun file..

Boh..me l'ha consigliata ZioSilvio al posto di gets...

VegetaSSJ5
13-01-2005, 20:26
ti faccio un esempio d'uso di fgets per leggere 30 caratteri (massimo) dalla tastiera (stdin, cioè standard input) e memorizzarli nel vettore buffer (che chiaramente deve essere lungo almeno 30 char):

fgets(buffer, 30, stdin);

ok?

MauryWeb
13-01-2005, 20:27
se usi fgets(bla,bla,stdin) è come usare gets(...)

beppegrillo
13-01-2005, 20:30
char *fgets(char *str, int n, FILE *stream);

Reads a line from the specified stream and stores it into the string pointed to by str. It stops when either (n-1) characters are read, the newline character is read, or the end-of-file is reached, whichever comes first. The newline character is copied to the string. A null character is appended to the end of the string.

On success a pointer to the string is returned. On error a null pointer is returned. If the end-of-file occurs before any characters have been read, the string remains unchanged.

Ovviamente puoi mettere anche standard input come stream.

VegetaSSJ5
13-01-2005, 20:35
Originariamente inviato da MauryWeb
se usi fgets(bla,bla,stdin) è come usare gets(...)
non è come usare gets perchè in fgets il secondo "bla" che hai scritto serve per dare un limite ai caratteri letti, per evitare il buffer overflow.

MauryWeb
13-01-2005, 20:42
la mia non era una critica!

non intendevo dire che usando fgets() si hanno gli stessi problemi di vulnerabilità come se si usasse la gets()
:O

-Yara-
13-01-2005, 20:45
Vi credo sulla parola ;)
Nel mio caso..potrei mettere fgets(matrice[i],stdin);
No?

-Yara-
13-01-2005, 20:51
Ho risolto cosi:

#include <iostream.h>
#include <stdio.h>

int main()
{
const int righe=5,colonne=20; //crea una matrice da 5 righe e 20 colonne; le colonne sono le lettere
char matrice[righe][colonne],scelta;
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire la parola di posto "<<i<<endl;
fgets(matrice[i],colonne,stdin);
}

do
{
cout<<"Desideri vedere la matrice? "<<endl;
cin>>scelta;
}while(scelta!='s');

if(scelta=='s')
{
for(i=0;i<righe;i++)
{
cout<<matrice[i]<<" ";
}
}
getchar();
}

In pratica la costanten colonne contiene il numero massimo di caratteri che voglio io :D
Bello, ma perchè gets è considerato poco sicuro?
Se ho capito bene, è perchè se per esempio io ho una stringa da 20 caratteri e ne metto 30, questa scrive gli altri 10 caratteri in un altra area di memoria.
Ho detto una cazzata? :sofico:

MauryWeb
13-01-2005, 20:51
Originariamente inviato da -Yara-
Vi credo sulla parola ;)
Nel mio caso..potrei mettere fgets(matrice[i],stdin);



fgets(matrice[i],MAXBUFF,stdin);

-Yara-
13-01-2005, 21:07
ho risposto su :)

cionci
14-01-2005, 07:56
Metti:

#include <iostream>
#include <cstdio>

using namespace std;


al posto di:

#include <iostream.h>
#include <stdio.h>

Il modo di includere che hai usato è deprecato...studiati qualcosa sui namespace...

-Yara-
14-01-2005, 13:51
Originariamente inviato da cionci
Metti:

#include <iostream>
#include <cstdio>

using namespace std;


al posto di:

#include <iostream.h>
#include <stdio.h>

Il modo di includere che hai usato è deprecato...studiati qualcosa sui namespace...

Ascolta..come mai devo mettere cstdio? perchè senza h? tra l'altro se metto iostream nel modo che mi hai detto tu da errore di compilazione (cout e cin undeclared)..Uso gcc versione 3.3.2 :confused:

cionci
14-01-2005, 15:15
Se metti using namespace std; vedrai che funziona tutti... Gli include del C si mettono con la "c" davanti per includerle nel namespace std... Fai una ricerchina sui namespace...

-Yara-
14-01-2005, 18:34
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
const int righe=5,colonne=20; //crea una matrice da 5 righe e 20 colonne; le colonne sono le lettere
char matrice[righe][colonne],scelta;
int i;
for(i=0;i<righe;i++)
{
cout<<"Inserire la parola di posto "<<i<<endl;
fgets(matrice[i],colonne,stdin);
}

do
{
cout<<"Desideri vedere la matrice? "<<endl;
cin>>scelta;
}while(scelta!='s');

if(scelta=='s')
{
for(i=0;i<righe;i++)
{
cout<<" ";
cout<<matrice[i];
}
}
getchar();
}

Perfetto, funziona. Grazie.
Un'altra cosa: io faccio la 3za itis informatica e quando facciamo programmi....includiamo sempre conio.h ecc e anche la funzione main la dichiariamo in void.....ed è il prof che ci ha insegnato cosi...ma è giusto o è il prof ebete :D ?

cionci
14-01-2005, 19:00
conio.h non è un header standard...quelle funzioni imparale e poi scordatele... Il prof probabilmente si limiterà a fare solo ciò che sa ;)