Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [C] Stringhe

  1. #1

    [C] Stringhe

    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.


    codice:
    #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;
    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non hai inizializzato i .

  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    non hai inizializzato i è questo porta delle conseguenze .

    altro piccolo particolare ,il programma è tutto da rifare

    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

    codice:
    
    #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 ma devo fare l'alievo
    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 !!
    Tecnologia

  4. #4
    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

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472

    Re: ciao

    Dai un'occhiata a queste correzioni ...

    codice:
        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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    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
    Tecnologia

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    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/c...tring/strncmp/
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    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"
    Tecnologia

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472

    Re: ciao

    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"
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    OFF TOPIC

    codice:
    Utilizza un buon libro (magari semplice, come il Deitel&Deitel) e studia seguendo il testo.
    Grazie dei consigli , provero a seguirli.

    codice:
    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 .
    Tecnologia

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.