PDA

Visualizza la versione completa : [C]Stringa e posizione del carattere terminatore


_d4vid3_
19-02-2011, 20:48
Buonasera,
sto cercando di fare un programma che, letta una stringa da tastiera, stampi la posizione nell'array del carattere terminatore '\0'.
Il mio problema che cosi' risolvo l'esercizio:


#include<stdio.h>
main()
{char string[20];
int i;
for(i=0;i<20;i++)
string[i]=' ';
printf("inserire stringa");
scanf("%s",string);
for(i=0;i<20;i++)
{if(string[i]=='\0')
printf("La posizione del terminatore %d\n",i);}
printf("%s",string);
getch();}


mentre in questo modo, che io riterrei equivalente al primo, non funziona (la posizione viene errata):



#include<stdio.h>
main()
{char string[20];
int i,cont;
printf("inserire stringa: ");
scanf("%s",string);
cont=0;
for(i=0;i<20;i++)
{if(string[i]!='\0')
cont++;}
printf("La posizione del terminatore %d\n",cont);
printf("%s",string);
getch();}


Come mai si verifica questa cosa?

Grazie , ciao!!!

lolide
19-02-2011, 21:53
Originariamente inviato da _d4vid3_
mentre in questo modo, che io riterrei equivalente al primo, non funziona (la posizione viene errata):


Fammi indovinare: il tuo metodo ti da il terminatore una posizione prima di quello che funziona ? :D

_d4vid3_
19-02-2011, 22:15
ciao!no no proprio del tutto "sfasato" ...nel senso che se metto il mio nome (davide) mi da' il terminatore in posizione 14....

(ps. cmq sono tutti e due miei metodi ...anzi ho pure inventato io l'esercizio :D)

lolide
19-02-2011, 22:25
Ah non l'avevo visto la prima volta :D

Se stringa[i] != '0' incrementa cont
e se uguale ?
O meglio, se uguale dopo che ha trovato il terminatore ?
continua ad incrementare cont :D

Prova cos:


cont = 1;
for(i=0;i<20;i++) {
if(string[i]!='\0')
cont++;
else
break;
}


cont fallo partire da 1 senn ti da una posizione in meno :)

:ciauz:

_d4vid3_
19-02-2011, 22:43
aspetta non ho capito molto bene....
vuoi dire che le posizioni dell'array dopo il terminatore potrebbero essere occupate da altri caratteri diversi dal terminatore e quindi il contatore continua ad essere incrementato?

cioe' intendi dire che potrei avere una situazione come la seguente:

davide\0altricaratteri

e quindi il contatore viene incrementato piu del dovuto??

lolide
19-02-2011, 23:02
certo cos.
tu dichiari una stringa di 20 caratteri. quando inserisci una stringa tico con scanf, lui mette davide\0 partendo dalla posizione 0, ma gli altri caratteri esistono ancora.

_d4vid3_
19-02-2011, 23:42
Approfitto della tua pazienza per farti ancora una domanda :)

Mi spieghi perch se scrivo questo programma:



#include<stdio.h>
main()
{char string[20];
int i;
for(i=0;i<20;i++)
string[i]='a';
for(i=0;i<20;i++)
{if(string[i]=='\0')
printf("\nLa posizione del terminatore %d\n",i);}
printf("%s",string);
getch();}


mi stampa a video la sequenza di 'a' seguita da alcuni caratteri "strani" (YA ecc...)?
inoltre in questo caso qui il terminatore non presente giusto?

grazie ancora :)

Ippo343
20-02-2011, 00:08
Proprio perch il terminatore non presente, lui arriva al 20simo carattere, e non trovando un terminatore, continua a stampare l'area di memoria successiva (che non fa parte della tua stringa, ma di dio solo sa cosa).

lolide
20-02-2011, 00:09
Originariamente inviato da _d4vid3_
mi stampa a video la sequenza di 'a' seguita da alcuni caratteri "strani" (YA ecc...)?
inoltre in questo caso qui il terminatore non presente giusto?

grazie ancora :)

Tu pensa che stringa una variabile che occupa 20 byte in memoria.
La memoria non tutta inizializzata a 0 (lo all'avvio del PC, inizializzata al POST del BIOS, ma poi con il caricamento/scaricamento di moduli, dll ecc... dal SO si sporca con valori)
Il terminatore semplicemente un valore standard (0x0, che non 0 il quale un carattere ascii che vale 0x30 in hex) che usano tutte le funzioni che lavorano con le stringhe (quasi tutte) per identificare che una stringa sia finita.

Volendo dichiarando una stringa di 20 caratteri (che alla fine un puntatore) potresti anche accedere al carattere 21 o 22 o 1203123, l'unico problema che incontri che ci sono alcune locazioni in memoria a cui non puoi accedere, perch sono protette.
scanf stampa ogni byte iniziando dal primo di quella stringa, fin quando incontra il terminatore (0x0). se tu inizializzi cos la stringa, lui non incontra il terminatore e continua accedendo al carattere 21, 22, 23 ecc.. fin quando non l'incontra.

_d4vid3_
20-02-2011, 00:26
Capito! grazie ancora! a presto ciao!!

Loading