View Full Version : [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???
Fenomeno85
30-03-2004, 18:15
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 ~§~
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.
se è come dici, allora perchè mi da errore sulla printf???
#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;
}
Fenomeno85
30-03-2004, 19:00
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 ~§~
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!
Fenomeno85
30-03-2004, 19:05
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 ~§~
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
Fenomeno85
30-03-2004, 19:09
se dichiari l'array allochi già lo spazio ;)
~§~ Sempre E Solo Lei ~§~
#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
Fenomeno85
30-03-2004, 19:25
te lo detto che non funziona quell'esempio .. se provi il mio funzega
~§~ Sempre E Solo Lei ~§~
Originariamente inviato da gola
#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?
Gervasoni
30-03-2004, 22:06
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......
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 ;)
TorpedoBlu
31-03-2004, 18:01
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.
Vabbè...limitati a questi:
char *stringa;
....
....
stringa = (char *) malloc (sizeof(char)*dim);
scanf("%s", stringa);
....
....
....
free(stringa);
oppure
char stringa[256];
scanf("%s", stringa);
TorpedoBlu
31-03-2004, 19:43
non so cosa sia malloc ne free... eh eh
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...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.