Problema sui vettori di caratteri

di il
9 risposte

Problema sui vettori di caratteri

Sono bloccato da ore su questo esercizio, chiede di creare un programma che stampi tutte le linee di input che superano gli 80 caratteri(nel programma che ho scritto ho fissato la soglia a 10 per velocizzare i test), per la prima linea non ci sono problemi, ma se più linee superano la soglia, la prima viene stampata bene, la seconda a volte la stampa mezza,altre volte stampa caratteri strani, poi sembra troncarsi l'output... dove sbaglio?

#include <stdio.h>
#define MAXLINE 1000
#define TARGET 10
#define MAXRES 1000
main()
{
	int i,c,f,len, totcar;
	totcar=0;
	len=0;
	f=0;
	char s[MAXLINE];
	char tar[MAXLINE];
	char riga[MAXRES];
	while ((c=getchar())!=EOF)
	{
		i=0;
		s[i]=c;
		for(i=1;(c=getchar())!=EOF && c!='\n' && i<MAXLINE;++i)
		{
			s[i]=c;
			
		}
		if(c=='\n')
		{
			s[i]=c;
			len=i;
			
		}
		s[i]='\0';
		if(len>=TARGET)
		{
			i=0;
			while((tar[i]=s[i])!='\0')
			{
				i++;
			}
			totcar=totcar+i;
			for(;f<totcar;f++)
			{
				riga[f]=tar[f];
			}
			riga[f]='\n';
			f++;
		}
		riga[f]='\0';
    }
	printf("%s", riga);
	
	return 0;
}

9 Risposte

  • Re: Problema sui vettori di caratteri

    Vogliamo imparare ad usare i code tags?
  • Re: Problema sui vettori di caratteri

    Scusate, questa parte di regolamento mi era sfuggita , ho già provveduto a modificare
  • Re: Problema sui vettori di caratteri

    Devi strutturare il programma altrimenti finisci nel creare pasticci:
    1)Si crea una funzione getline che ritorni la linea letta + il numero di caratteri
    2)si esegue un ciclo per n volte e si visualizzano le linee > di x
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define LINE_MIN_SIZE 10
    #define LINE_MAX 10
    #define LINE_WIDTH 1000
    
    int getline(char* d,int max)
    {
        int i;
        char c;
        for (i=0; i < max - 1;i++)
        {
            c=getchar();
            if (c == '\n') break;
            *d++=c;
        }
    
    
        *d='\0';
        return i;
    }
    
    int main()
    {
        printf("Hello world!\n");
    
        char r[LINE_WIDTH];
        int i;
    
        for (i=0; i < LINE_MAX ; i++)
        {
            if (getline(r,LINE_WIDTH) > LINE_MIN_SIZE)
                printf("read > %d::%s\n",LINE_MIN_SIZE,r);
        }
    
        return 0;
    }
    
    
  • Re: Problema sui vettori di caratteri

    Ora dopo tanto ero arrivato alla conclusione, però ci sono riuscito senza usare funzioni, devo ammettere che la tua versione del codice è molto meno "incasinata", però sono agli inizi, alcuni comandi che hai usato (ad esempio stdlib.h) devo ancora studiarli...
    posto comunque la versione corretta senza la funzione getline, dal prossimo programma è meglio se comincio ad usare le funzioni come hai suggerito, grazie
    #include <stdio.h>
    #define MAXLINE 1000
    #define TARGET 80
    #define MAXRES 1000
    main()
    {
    	int i,c,f,len, totcar;
    	totcar=0;
    	len=0;
    	f=0;
    	char s[MAXLINE];
    	char tar[MAXLINE];
    	char riga[MAXRES];
    	while ((c=getchar())!=EOF)
    	{
    		i=0;
    		s[i]=c;
    		for(i=1;(c=getchar())!=EOF && c!='\n' && i<MAXLINE;++i)
    		{
    			s[i]=c;
    			
    		}
    		if(c=='\n')
    		{
    			s[i]=c;
    			len=i;
    			i++;
    		}
    		s[i]='\0';
    		if(len>=TARGET)
    		{
    			i=0;
    			while((tar[i]=s[i])!='\0')
    			{
    				i++;
    			}
    			totcar=totcar+i;
    			i=0;
    			for(;f<totcar;f++)
    			{
    				riga[f]=tar[i];
    				i++;
    			}
    			if(c!='\n')
    			{
    				riga[f]='\n';
    				f++;
    		    }
    		}
    		riga[f]='\0';
        }
    	printf("%s", riga);
    	
    	return 0;
    }
  • Re: Problema sui vettori di caratteri

    Dimenticavo,per i piu smaliziati:
    una forma piu compatta:
    
    int getline(char* d,int max)
    {
        char* od=d;
        while (!(max-- == 0 || (*d++=getchar()) =='\n'));
        *--d='\0';
        return d-od;
    }
    
    int getline(char* d,int max)
    {
        int i;
        for (i=0; !(i == max || (*d++=getchar()) =='\n') ;i++);
        *--d='\0';
        return i;
    }
    
    int getline(char* d,int max)
    {
        char *od=d;
        while (!(d == od + max || (*d++=getchar()) =='\n'));
        *--d='\0';
        return d-od;
    }
    
  • Re: Problema sui vettori di caratteri

    La stdlib puoi anche non includerla,me l'ha messa l'ide in automatico.
    cmq la forma pro strudente:
    
    #include <stdio.h>
    
    #define LINE_MIN_SIZE 8
    #define LINE_MAX 10
    #define LINE_WIDTH 1000
    
    int main()
    {
        printf("Hello world!\n");
    
        char r[LINE_WIDTH];
        int c;
        int i,k;
    
        for (i=0; i < LINE_MAX ; i++)
        {
            k=0;
            while((c=getchar())!='\n')
            {
                if (k < LINE_WIDTH - 1)
                {
                    r[k]=c;
                    k++;
                }
            }
            r[k]='\0';
            if (k > LINE_MIN_SIZE) printf("Have read %d char::!%s!\n",k,r);
        }
    
        return 0;
    }
    
  • Re: Problema sui vettori di caratteri

    Grazie vbextreme, solo una cosa non capisco, che funzione hanno nei tuoi programmi i simboli " * "?
  • Re: Problema sui vettori di caratteri

    Puntatore, non l'hai ancora studiato vero?
    non ti dico niente,non vorrei farti confusione.
  • Re: Problema sui vettori di caratteri

    No, non ancora, ok dai, grazie di tutto
Devi accedere o registrarti per scrivere nel forum
9 risposte