Problema esercizio funzioni e vettori di caratteri

di il
4 risposte

Problema esercizio funzioni e vettori di caratteri

Qualcuno mi spiegherebbe perchè in questo programma ogni volta che premo invio lasciando la riga di input vuota esce? come risolvo?
#include <stdio.h>
#define MAXLINE 1000
#define MAXCHAR 10000
int getline(char r[], int maxline);
void copy(char line[],char nospaceln[]);

main()
{
	char r[MAXLINE], line[MAXLINE], nospaceln[MAXLINE], result[MAXCHAR];
	int i,w,gl;
	w=0;
	while (gl=getline(r,MAXLINE))
	{
		copy(r, nospaceln);
		for (i=0;i<gl;i++)
		{
		result[w]=nospaceln[i];
		w++;
		}
		result[w]='\n';
		w++;
	}
	printf("%s \n", result);
	return 0;
}
int getline(char s[],int maxl)
{
	int i,len,cf,f;
	f=0;
	for(i=0;i<maxl && (cf=getchar())!=EOF && cf!='\n';++i)
	{
		if (cf!=' ' && cf!='\t')
		{
			s[f]=cf;
			f++;
	    }
	}
		len=f;
	
	return len;
}
void copy(char line[],char nospaceln[])
{
	int i;
	for (i=0;line[i]!='\0';i++)
	{
			nospaceln[i]=line[i];
	}
	nospaceln[i]='\0';
}
il risultato dovrebbe essere un programma che restituisca come output lo stesso input senza spazi, tab e senza righe vuote, per gli spazi e tab ci sono riuscito, ma se inserisco una linea vuota esce direttamente dal programma...

4 Risposte

  • Re: Problema esercizio funzioni e vettori di caratteri

    Nella funzione getline la condizione di permanenza nel ciclo for è la seguente:
    i<maxl && (cf=getchar())!=EOF && cf!='\n'

    Se inserisci una linea vuota il corpo del ciclo non viene mai eseguito, di conseguenza f sarà uguale a 0 e la funzione getline restituirà 0. Come ulteriore conseguenza il while all'interno del main non sarà mai eseguito e si arriverà subito alla printf (che dovrebbe stampare dei valori a caso)..
  • Re: Problema esercizio funzioni e vettori di caratteri

    Sì, in effetti controllando con il debug già avevo notato che saltava l'intero while, però il programma è stato fatto su spunto di quest'altro:
    #include <stdio.h>
    #define MAXLINE 1000 /* lunghezza massima di una linea */
    int getline(char line[], int maxline);
    void copy(char to[], char from[]);
    /* stampa la linea di input più lunga */
    main()
    {
    int len; /* lunghezza della linea corrente */
    int max; /* massima lunghezza trovata sinora */
    char line[MAXLINE]; /* linea di input corrente */
    char longest[MAXLINE]; /* linea più lunga salvata qui */
    max=0;
    while ((len=getline(line, MAXLINE))>0)
    if (len>max)
    {
    max=len;
    copy(longest, line);
    }
    if (max>0) /* cerca almeno una linea in input */
    printf("%s", longest);
    return 0;
    }
    /* getline: legge e carica in s una linea, ritorna la lunghezza */
    int getline(char s[], int line)
    {
    int c, i;
    for (i=0; i<line-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i]=c;
    if (c=='\n')
    {
    s[i]=c;
    ++i;
    }
    s[i]='\0';
    return i;
    }
    /* copy: copia ‘from’ in ‘to’; assume che ‘to’ sia
    sufficientemente ampio */
    void copy(char to[], char from[])
    {
    int i;
    i=0;
    while ((to[i]=from[i])!='\0')
    ++i;
    }
    che è tratto dal libro "il linguaggio c", questo programma fa una cosa diversa, ma è strutturato nello stesso modo... riuscireste a spiegarmi perchè il suo while funziona e il mio no?
  • Re: Problema esercizio funzioni e vettori di caratteri

    Beh nel programma il "ritorno a capo" viene gestito con questa parte di codice:
    
    if (c=='\n'){
    	s[i]=c;
    	++i;
    }
    
    Anche nel codice del libro se l'utente inserisce una riga vuota (ovvero preme INVIO, che equivale a inserire il carattere '\n') il controllo esce subito dal ciclo for, ma dopo di esso il programma controlla se è stato inserito un ritorno a capo e, in caso affermativo, inserisce nella stringa tale carattere, incrementando i (che poi sarà il valore che la funzione restituisce).

    Nota che dalla console di windows l'unico modo per inserire un EOF è tramite la combinazione di tasti CTRL+Z, mentre premendo INVIO si inserisce un '\n'.
  • Re: Problema esercizio funzioni e vettori di caratteri

    Hai ragione, ora funziona, era proprio quella la parte di codice che mancava
Devi accedere o registrarti per scrivere nel forum
4 risposte