Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-03-2004, 18:11   #1
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
[C]Principiante: domande sulle strinche

allora ho iniziato a programmare in C per l'esame di algoritmi in università, ora io provengo da java (esame di programmazione 1, quindi so giusto lessenziale).
ora ho dei grossi problemi, java mi sembra + frendly come approccio (una volta capita la filosogia a oggetti) mi ritrovo bloccato ad esempio a non capire come si costruisce una stringa, il tipo String esiste?? ho letto che una stringa è un array di caratteri e mi riferisco a lei con un puntatore (anche qui molti dubbi), come faccio a fare una funzione leggi strnga?? ho provato così, ma non funziona (non insultatemi sicuramente ci sono delle grosse boiate)

#include <stdio.h>
char *leggiStringa(void){
int i =0;
char c, stringa[50];
c = getChar();
while(c!='\n'){
stringa[i] = c;
c = getChar();
i++;
}
return *stringa;
}

mi dite che cosa sbaglio? e soprattutto come si gestiscono le stringhe???
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 18:15   #2
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
se vuoi inserire carattere per carattere devi anche ricordarti di mettere il catattere di fine stringa.

char stringa [10];

gets (stringa); ->prendi una stringa
puts (stringa); ->leggi una stringa

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 18:33   #3
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Il primo errore del tuo programma sta nel fatto di ritornare *stringa: questo indica un carattere mentre tu hai dichairato di ritornare un puntatore a carattere. Quindi devi ritornare stringa e non *stringa. Pero la variabile stringa non puo essere dichiarata localmente perche all'uscita dalla funzione, stringa, essendo una variabile locale, viene distrutta e il puntatore punterà ad una locazione senza significato. Una soluzione sta nel dichiarare stringa come variabile globale o nel passarla come parametro di leggistringa. Inoltre si scrive getchar e non getChar; infine se vuoi leggere una stringa:

char *stringa;
scanf("%s", stringa);

In c le stringhe non sono Object come java, ma sono degli array di caratteri. A loro volta, gli array altro non sono che dei puntatori al primo elemento dell'array stesso. Quindi una stringa la dichiari semplicemente come un puntatore a char. La tua variabile stringa è difatti un opuntatore al primo char della stringa stessa.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 18:46   #4
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
se è come dici, allora perchè mi da errore sulla printf???

Codice:
#include <stdio.h>

int main(void){
	char *stringa1 ="questa è la prima stringa (costante) \n";
	char *stringa2 ="";
	scanf("%s",stringa2)
	printf("%s\n%s\n\n  fine",stringa1,stringa2);
	return 0;
}
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:00   #5
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
se usi i puntatori ti tocca allocare lo spazio ... con il puntatore non fai niente

#include <stdio.h>
#include <conio.h>

void main ()
{
char stringa[10];
printf ("Inserisci stringa:");
gets (stringa);
printf ("La stringa inserita è: %s", stringa);
}


~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso

Ultima modifica di Fenomeno85 : 30-03-2004 alle 19:03.
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:03   #6
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
Quote:
Originariamente inviato da anx721
Il primo errore del tuo programma sta nel fatto di ritornare *stringa: questo indica un carattere mentre tu hai dichairato di ritornare un puntatore a carattere. Quindi devi ritornare stringa e non *stringa. Pero la variabile stringa non puo essere dichiarata localmente perche all'uscita dalla funzione, stringa, essendo una variabile locale, viene distrutta e il puntatore punterà ad una locazione senza significato. Una soluzione sta nel dichiarare stringa come variabile globale o nel passarla come parametro di leggistringa. Inoltre si scrive getchar e non getChar; infine se vuoi leggere una stringa:

char *stringa;
scanf("%s", stringa);

In c le stringhe non sono Object come java, ma sono degli array di caratteri. A loro volta, gli array altro non sono che dei puntatori al primo elemento dell'array stesso. Quindi una stringa la dichiari semplicemente come un puntatore a char. La tua variabile stringa è difatti un opuntatore al primo char della stringa stessa.
ma ho fatto come dice lui!
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:05   #7
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
Quote:
Originariamente inviato da gola
ma ho fatto come dice lui!
allora il puntatore è il nome dell'array cioè:

char stringa[10];

stringa è anche il puntatore

ma se dichiari un puntatore ... devi anche allocare dello spazio ... se non mi ricordo male era con malloc

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:07   #8
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
Quote:
Originariamente inviato da Fenomeno85
allora il puntatore è il nome dell'array cioè:

char stringa[10];

stringa è anche il puntatore

ma se dichiari un puntatore ... devi anche allocare dello spazio ... se non mi ricordo male era con malloc

~§~ Sempre E Solo Lei ~§~
??? aspetta, se creo l'array non alloco spazio con una funzione giusto? malloc ancora non l'ho studato
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:09   #9
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
se dichiari l'array allochi già lo spazio

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:23   #10
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
Codice:
#include <stdio.h>
#define MAX_STRING 50
int main(void){
	char *stringa1 ="questa è la prima stringa (costante) \n";
	char stringa2[MAX_STRING] ;
	scanf("%s",stringa2)
	printf("%s\n%s\n\n  fine",stringa1,stringa2);
	return 0;
}
guarda che non funziona, stesso errore
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:25   #11
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
te lo detto che non funziona quell'esempio .. se provi il mio funzega

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 19:28   #12
gola
Senior Member
 
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
Quote:
Originariamente inviato da gola
Codice:
#include <stdio.h>
#define MAX_STRING 50
int main(void){
	char *stringa1 ="questa è la prima stringa (costante) \n";
	char stringa2[MAX_STRING] ;
	scanf("%s",stringa2);
	printf("%s\n%s\n\n  fine",stringa1,stringa2);
	return 0;
}
guarda che non funziona, stesso errore
ok, ok mancava un ";" sono un pirla.

quindi ogni volta che creo una stringa devo definire un array e quindi una grandezza (con una macro) giusto?
gola è offline   Rispondi citando il messaggio o parte di esso
Old 30-03-2004, 22:06   #13
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
Nel C le stringhe non sono un tipo di dato base e sono gestite come vettore di caratteri. Nell C++ invece esistono i dati di tipo string.

Una costante stringa può essere definita al tempo di compilazione mediante la direttiva

#define NOME_STRINGA "stringa"

Ad esempio:

#define stringa1 "Questa è la prima stringa (costante)"

Oppure al tempo di esecuzione nel seguente modo:

void main()
{
const char stringa1[]="Questa è la prima stringa (costante)"
.....


}

La dichiarazione di una variabile avviene soltanto al tempo di esecuzione secondo il seguente formato:

void main()
{
char stringa1[]="Questa è la prima stringa (costante)"
.....


}

Se vuoi inserire da tastiera una stringa è obbligatorio specificarne la grandezza massima dimensionando quindi il vettore di caratteri.
La dichiarazione di una variabile stringa dimensionata avviene nei seguenti modi:

1.
#define GRANDEZZA_MASSIMA 51
(devi aggiungere 1 al totale perchè il C alla fine di una stringa aggiunge in automatico il carattere di null \0)
void main()
{
char stringa1[GRANDEZZA_MASSIMA]
.....


}


2.
void main()
{
const int GRANDEZZA_MASSIMA=51
char stringa1[GRANDEZZA_MASSIMA]
.....


}

3.
void main()
{
char stringa1[51]
.....


}

La dichiarazione di una costante stringa dimensionata avviene allo stesso modo delle variabili ma anteponendo const davanti char stringa1......
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 01:27   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da anx721
infine se vuoi leggere una stringa:

char *stringa;
scanf("%s", stringa);

In c le stringhe non sono Object come java, ma sono degli array di caratteri. A loro volta, gli array altro non sono che dei puntatori al primo elemento dell'array stesso. Quindi una stringa la dichiari semplicemente come un puntatore a char. La tua variabile stringa è difatti un opuntatore al primo char della stringa stessa.
Niente di più sbagliato

char *stringa;
....
....
stringa = (char *) malloc (sizeof(char)*dim);
scanf("%s", stringa);
....
....
....
free(stringa);

oppure

char stringa[256];
scanf("%s", stringa);

Il secondo metodo si usa quando sappiamo a priori la dimensione della stringa da allocare...il primo quando la dimensione viene determinata in fase di esecuzione (ed allocata con malloc)...

Ma il metodo che preferisco è questo... Usare un qualsiasi tipo di allocazione sopra con la dimensione pari a DIM ed una lettura di questo tipo:

fgets(stringa, DIM-1, stdin);
/*ora bisogna togliere l'ultimo carattere se è uno \n*/
(stringa[strlen(stringa)-1] == '\n') ? (stringa[strlen(stringa)-1] = '\0') : 0;

oppure in maniera + leggibile:

int last;
....
....
fgets(stringa, DIM-1, stdin);
/*ora bisogna togliere l'ultimo carattere se è uno \n*/
last = strlen(stringa)-1;
if(stringa[last] == '\n') stringa[last] =='\0';


fgets evita uno dei pericoli maggiori per i nostri programmi (e per i nostri sistemi operativi)...il buffer overflow

Ultima modifica di cionci : 31-03-2004 alle 10:04.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 18:01   #15
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
grazie mille alla professionalità di cionci, ma ripeto che sono un principiante e dei tuoi codici non ci capisco un granchè.... eh eh, cmq quello che ho capito è che bisogna allocare lo spazio in fase di comilazione per un array (per me che sono un principiante) e poi gestirlo a piacere come array o puntatore.
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 19:40   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Vabbè...limitati a questi:
Codice:
char *stringa; 
.... 
.... 
stringa = (char *) malloc (sizeof(char)*dim); 
scanf("%s", stringa); 
.... 
.... 
.... 
free(stringa); 

oppure 

char stringa[256]; 
scanf("%s", stringa);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 19:43   #17
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
non so cosa sia malloc ne free... eh eh
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 31-03-2004, 19:47   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
malloc alloca memoria (un numero di byte pari alla dimensione passata come parametro) e ritorna un puntatore a void...poi modificato tramite un cast, leggi conversione, esplicita...

free libera la memoria alloca da malloc...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Amazon, ecco i super sconti del weekend:...
Scovare un bug di sicurezza sui disposit...
Offerta Amazon su NordVPN: proteggi 10 d...
ECOVACS DEEBOT X8 PRO OMNI in offerta su...
Scope elettriche Tineco in offerta su Am...
Offerta Amazon sui robot EUREKA J15 Ultr...
Chrome disattiverà automaticament...
Tornano tutti e 4 i colori disponibili p...
Super sconto su iPhone 16: Amazon abbass...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v