PDA

Visualizza la versione completa : [C] Stringhe


giovanni.91
02-03-2012, 17:03
Ciao a tutti, ho fatto un programma che fa immettere una frase all'utente. Quando l'utente digita la parola 'fine', il programma smette e stampa tutto quello inserito fino a quel momento.

Il compilatore compila il programma senza segnalare errori, soltanto che appena va in esecuzione mi si blocca il pc. Dove può essere l'errore?

Grazie.





#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// programma che fa smettere all'utente di immettere caratteri quando digita la parola 'fine'

int main()
{
char stringa[200];
int i;

printf("Inserisci il testo\n");

while (stringa[i]!='e'&&stringa[i-1]!='n'&&stringa[i-2]!='i'&&stringa[i-3]!='f'){
for(i=0;i<200;i++){
scanf("%c", &stringa[i]);
}
}

printf("STAMPA STRINGA\n %s \n", stringa);

system("pause");
return 0;
}

ramy89
02-03-2012, 17:31
Non hai inizializzato i .

torn24
02-03-2012, 18:42
non hai inizializzato i è questo porta delle conseguenze .

altro piccolo particolare ,il programma è tutto da rifare :D

all' interno del while hai un for, che si aspetta che inserisci 200 caratteri prima di terminare.

la scanf , all'interno del for si aspetta che ad ogni carattere immesso premi invio .

all' uscita del for , se non hai scritto fine , il while continuerebbe ,e provrerebbe ad inserire altri caratteri nell array , che non puo contenerli .


io suggerisco di usare una funzione non standar getch





#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// programma che fa smettere all'utente di immettere caratteri quando digita la parola 'fine'

int main()
{
char stringa[200];
char terminatore[5];
int i=0,j,k;

printf("Inserisci il testo\n");

do
{
stringa[i]=getch();
putch(stringa[i]);
if(stringa[i]==13)
{
putch(13);
putch(10);
}
i++;

if(i>=3)// preleva gli ultimi 4 caratteri
{
for(j=strlen(stringa)-4,k=0;k<4;k++,j++)
terminatore[k]=stringa[j];

terminatore[k]=0;


}
if(strcmp(terminatore,"fine")==0)break;
}while(1 );
puts("");
printf("STAMPA STRINGA\n %s \n", stringa);

system("pause");
return 0;
}










HO PROVATO A FARE IL MAESTRO :old: ma devo fare l'alievo :biifu: :biifu:
ma anche il codice che ho postato io , non si comporta propio a dovere a volte termina
altre no , comunque per i motivi che ti ho detto , il programma che hai postato, non può
comportarsi come ti aspetteresti .
aspetto , che le persone piu competenti , mi spieghino pechè ,anche il mio codice da problemi , come logica mi sembra che vada !!

ardito86
02-03-2012, 19:09
Credo che sia dovuto al fatto che hai messo:
if (i>=3)

Se i = 3 vuol dire che la lunghezza della stringa è 3, e facendo strlen(stringa)-4 viene -1, e quindi stringa[-1] leggi in una memoria dove non ti è permesso

oregon
02-03-2012, 19:11
Dai un'occhiata a queste correzioni ...



do
{
stringa[i]=getch();
putch(stringa[i]);

stringa[i+1]=0;

if(stringa[i]==13)
{
i++;
stringa[i]=10;
putch(stringa[i]);
stringa[i+1]=0;
}

i++;

if(i>=4)
if(strncmp(stringa+strlen(stringa)-4, "fine", 4)==0)
break;

} while(1);


e manca ancora il controllo per lo sfondamento di stringa ...

torn24
03-03-2012, 09:31
:) Grazie delle correzzioni , molto educative .

Ci ho messo un po per capire cosa facesse strncmp ,mai usato questa funzione , e negli esempi online , non mi appariva chiaro come usarla !

spiegazione della funzione :

come ho capito , imposti l'indice del primo array char , a dove vuoi iniziare il confronto ,
stringa di confronto , e numero caratteri da confrontare !???

strncmp(stringa+strlen(stringa)-4, "fine", 4)



perdonami la spiegazione , che probabilmente è molto confusa :D

oregon
03-03-2012, 11:57
Dai un'occhiata alla documentazione ... (ma dovresti facilmente trovarla nel tuo libro da dove hai studiato o studi il C)

http://www.cplusplus.com/reference/clibrary/cstring/strncmp/

torn24
03-03-2012, 12:51
si ho guardato , la descrizione di strncmp , ma non ho mai visto usarla come la hai usata tu.

ossia , confrontare una porzione di stringa con un altra .

sono "trucchetti" , di cui non trovi esempii .


allora mi sorge un dubbio , visto che bisognava controllare la presenza di "fine" a fine riga

andava bene anche strcmp(stringa+strlen(stringa)-4, "fine")

P.S.
il libro con cui ho iniziato , è un libro che mi hanno prestato tempo fa , c per superiori elettronica,è veramente essenziale , agli inizii non sono riuscito a trovare un esempio di
una funzione che ritorna un puntatore char "cosa appresa poi online" :dhò: :)

oregon
03-03-2012, 17:38
Originariamente inviato da torn24
si ho guardato , la descrizione di strncmp , ma non ho mai visto usarla come la hai usata tu.

ossia , confrontare una porzione di stringa con un altra .


Mi spiace deluderti ma non ho scoperto nulla di nuovo ... quella funzione (come anche la strcmp) si usano spesso in quel modo.


andava bene anche strcmp(stringa+strlen(stringa)-4, "fine")

La strcmp prevede che le due stringhe siano terminate dal NUL ... ma nel tuo caso la prima non era terminata ...

E anche la strlen prevede il terminatore NUL e quindi dava problemi ...



Il libro con cui ho iniziato , è un libro che mi hanno prestato tempo fa , c per superiori elettronica,è veramente essenziale , agli inizii non sono riuscito a trovare un esempio di
una funzione che ritorna un puntatore char "cosa appresa poi online" :dhò: :)

Non va bene ... non continuare *solo* con gli esempi dal forum.

Utilizza un buon libro (magari semplice, come il Deitel&Deitel) e studia seguendo il testo.
Soprattutto *evita* di affrontare dei problemi se non hai le basi necessarie a farlo perché ti puoi confondere parecchio.

torn24
04-03-2012, 10:16
OFF TOPIC



Utilizza un buon libro (magari semplice, come il Deitel&Deitel) e studia seguendo il testo.



Grazie dei consigli , provero a seguirli.



Soprattutto *evita* di affrontare dei problemi se non hai le basi necessarie a farlo perché ti puoi confondere parecchio.




in pratica , impara a risolvere un problema , e poi cerca di aplicare la soluzione in un esercizio .
non sono del tutto daccordo ! ottimo sistema per chi deve superare un esame e deve
apprendere le cose necessarie , per chi lo fa per hobby e divertimento , cimentarsi ad affrontare un problema , senza sapere , di preciso , quali difficoltà incontrerà , è stimolante
e trovando problemi da risolvere ,documentarsi per affrontarlo , accresce la tua preparazione.


Comunque , capisco benissimo il tuo punto di vista , sono le differenze di opinioni che si trovano in tutti i campi , quando si confrontano un professionista del settore e un obbysta .


Immagina , un aereo modellista o modellista , che si cimenti a reallizzare ,solo progetti di cui e sicuro di non incontrare difficolta o imprevisti .

Loading