PDA

Visualizza versione completa : Programma stupidissimo mi da noie!!!!



beatoangelico
13-11-2003, 19.23.11
raga sto prendendo in mano il c++ dopo un sacco di tempo....
Cmq anche tempo fa non avevo studiato che i rudimenti....
Ma veniamo al punto,ho fatto questo semplice programmino che dovrebbe ricevere l'input dall'utente sotto forma di un nome e poi restituire quanto immesso..
Il problema è che una volta fatto partire mi mostra solo la prima lettera del nome.....



#include <iostream>
using namespace std;
char main()
{
char nome;
cout << "Inserisci il nome \n";
cin >> nome;
cout << "il nome e' " << nome;
return 0;
}

Mi sapete dire dove ho sbagliato?

Cmq uso il Dev-C++ per compilare, versione 4.9.8.4

grazie a tutti in anticipo...

TrustNoOne
14-11-2003, 02.31.45
beh, nome non puoi dichiararlo come char, e' una stringa, quindi un array di char (o qualche altra struttura allocata dinamicamente magari)...

Poi non mi risulta che il main ritorni char, non so se e' lecito, ma io ho sempre messo int ;)

follettomalefico
14-11-2003, 14.00.11
Esattamente come ti ha detto trust.
Mi permetto però di riscrivere il source con printf e scanf.




#include <stdio.h>

int main()
{
char nome[50];
printf("Inserisci il nome \n");
scanf("%s", &char);
printf("Il nome e' %s", nome);
return 0;
}

Ehm non l'ho compilato, magari da qualche piccolo errore, ma è questo.

PS: qui si fa uso esplicito dei puntatori. Anche se non essenziale, perchè un array costituisce già in realtà un puntatore al primo elemento della struttura, preferisco sempre esplicitarlo con l'uso dell'& (&char).

beatoangelico
14-11-2003, 14.38.43
One moment,fatemi capire....
il tipo di variabile char ammette solo un valore al suo interno?
cioè nella variabile char posso mettere solo una lettera?

secondo:
qual'è l'identificatore delle stringhe?per dichiarare una variabile di tipo stringa....

terzo:foll ma a che servono printf e scanf?non li ho ancora fatti...:(

follettomalefico
14-11-2003, 14.48.13
1. "char" è una variabile che significa "carattere". Quindi si, UN solo valore al suo interno.


2. Una stringa non è altro che un aggregato di caratteri no? Quindi, un array di char. E si dichiara con char nome[];.


3. scanf e printf sono le versioni più usate, migliori e più efficienti (formatted) delle obsolete e arcaiche cin cout.

beatoangelico
14-11-2003, 15.08.55
1)tnx ero arrivato ad immaginarlo...

2)Vero vero vero vero vero vero vero!!! Ma un array non si deve dichiarare in qualche modo?

per esempio nel pascal scrivevo nome:array [1..6] of char

3)come mai non si usano piu?
che svantaggi hanno cout e cin?
per ora credo continuerò ad usarli perche il libro porta cosi..

follettomalefico
14-11-2003, 15.14.23
Originally posted by beatoangelico
1)tnx ero arrivato ad immaginarlo...

2)Vero vero vero vero vero vero vero!!! Ma un array non si deve dichiarare in qualche modo?

per esempio nel pascal scrivevo nome:array [1..6] of char

3)come mai non si usano piu?
che svantaggi hanno cout e cin?
per ora credo continuerò ad usarli perche il libro porta cosi..

2. Certo, esattamente come ho scritto sopra:
char nome[50];

Array da 0 a 50 di tipo char.

3. Non si usano perchè troppo "diretti", semplici e senza alcun sistema di formattazione, buffering, ottimizzazione o che altro.

cin e cout prendono e buttano. Fine.
scanf e printf invece leggono e scrivono. Facendo controllo di tipo (sono i % che vedi nel testo), facendo buffering e altre cosine carine :)

Io ti consiglio, indipendentemente dal libro, di sostituire ogni votla che vedi cin con scanf e cout con printf, come ho fatto io sopra.

beatoangelico
14-11-2003, 15.17.36
vedro...cmq per ora non so quanto mi servano...

un'info...
io uso per compilare Dev-cpp,quando mando quel programma in esecuzione, dopo aver inserito il nome dovrebbe mostrarlo,come mai la finestra si chiude talmente velocemente da non lasciarmi vedere il risultato?
credevo bastasse
return 0;

follettomalefico
14-11-2003, 15.19.15
Non puoi eseguirlo separatamente in linea di comando?

Oppure aggiungi uno scanf vuoto (che legga qualcosa, ma senza uno scopo preciso) al solo fine di pausare l'esecuzione.

return 0 dice soltanto che il programma, una volta terminato, restituisce 0 al sistema operativo o al programma chiamante.

Solitamente, 0 = applicazione completata con successo, altri valori se vi son stati errori.

beatoangelico
14-11-2003, 15.25.48
Originally posted by follettomalefico
[B]Non puoi eseguirlo separatamente in linea di comando?
si ma è uno sbattimento...cosi invece faccio sempre ctrl +F10....:D


Oppure aggiungi uno scanf vuoto (che legga qualcosa, ma senza uno scopo preciso) al solo fine di pausare l'esecuzione.

ma devo creare una variabile apposta? tipo...

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

using namespace std;
int main()
{
char nome[6];
cout << "Inserisci il nome \n";
cin >> nome;
cout << "il nome e' " << nome << endl;
scanf
return 0;
}
ma mi da errore prima di return...

follettomalefico
14-11-2003, 15.28.20
Ovvio:
- non c'è il puntoevirgola ;
- non ci son le parentesi, tutte le funzioni hanno parentesi ().
- anche avessero parentesi, SI, ti serve una variabile finta di appoggio... o una di quelle già create.
- se usi scanf, devi specificare il tipo (la f sta per formatted ricordi?)

Quindi:
scanf("%s", &nome);


(6 non ti pare troppo corto come nome?)

beatoangelico
14-11-2003, 15.29.57
sono solo prove...
cmq credo che finchè non usero scan e print faro tutto da riga di testo..

TrustNoOne
15-11-2003, 05.04.17
in c++ cmq dovrebbe esserci qualcosa per gestire le stringhe.
#include <string>

lc classe e' string, e hai a disposizione un po' di metodi per fare le cose piu' in fretta.. Non ho letto bene cosa faccia (sono le 4 emh ), non so se gestisca dinamicamente le dimensioni per evitare overflow e roba di sto genere, dai un occhio tu, ho trovato qua: http://www.msoe.edu/eecs/ce/courseinfo/stl/string.htm, ma c'e' anche un sacco di altra roba in giro

Occhio che la scanf con %s si ferma al primo spazio (almeno cosi' mi pare, non so se dipende dall'architettura sulla quale lavori e dalle librerie che usi boh.. L'ultima volta in lab che stavo facendo una robaccia inutile mi faceva cosi' :asd: )
C'e' anche la gets che pero' mi pare sia deprecata...

edit: ho letto ora, nella libreria string c'e' anche la funzione readline (che non fa parte della classe) che fa tutto da sola, e gestisce tutte queste scocciature automaticamente...
Impara a usare le scanf e printf prima di usare questa classe pero' :D

edit2: ah, m'ero scordato di dirti che per usarla devi importare il namespace std, oppure std::string solamente ;)