[c] esercizzio conteggio caratteri da stdin

luca981
con il linguaggio c
mi sono accorto di avere un programmino che conta i caratteri del file .
tipo cosi
FILE *fpSource;
   if((fpSource = fopen("righe.txt", "r")) != NULL)
   {
      codice
   }
   else
   {
      perror("Errore in apertura del file. \n");
   }

cosi ho provato ha fare la stessa cosa con lo stdin
ma dopo un po di prove ho dei problemi !
#include<stdio.h>
#define MAX_SIZE 60
main()
{
   int nc;                                /*conteggio dei caratteri*/
   char ca;                               /* carattere */
   char riga[MAX_SIZE] = "";              // prima stringa esterna di carica                                   usata da reset
   nc = 0;
   fgets(riga, MAX_SIZE, stdin);
   while ((ca=fgetc(riga)) != EOF)
   {
   ++nc;
   }
   printf("\ti caratteri sono :  %d\n", nc);
}

il tipo di errore e questo ...... deve essere uno sbaglio sui puntatori.
luca@luca-desktop:~/Scrivania/progetto$ gcc progetto7.c
progetto7.c: In function ‘main’:
progetto7.c:10: warning: passing argument 1 of ‘fgetc’ from incompatible pointer type
luca@luca-desktop:~/Scrivania/progetto$ 

qualcuno sa darmi una mano ?

Risposte
karhel
Prego :)

luca981
approposito , mi sono accorto che :
se inserisco da stdin la frase con piu spazzi .
il programma a video mi fa vedere simboli casuali .
tipo :
>>
>>
>>���������
>>T)�����;��
>>X8��q��

come faccio ad oviare questo problema ?

karhel
#include<stdio.h>

main()
{
   int max_riga=20;
   int max_colonna=20;   
   int lung=0;           
   int stri=0;
   int spaz=0;
   char c;         
   int i;

   char input[max_riga][max_colonna];
   input[stri][0] = '\0';
   while ((c = fgetc(stdin)) != '\n')
   {

      if (c == ' ')
      {
       if(spaz==0)     
       { 
        lung=0;
        stri++;
       }
       spaz=1;  
      }
      else
      {   
       spaz=0;   
       input[stri][lung] = c;
       input[stri][lung+1] = '\0';
       lung++;
      }
   }
   printf("\n");
   for(i=0;i<stri+1;i++)
   printf(">>%s\n", input[i]);
} 



beh sostanzialmente aumentando max_riga e max_colonna
ti da quell'errore perché stai uscendo dai limiti definiti per la struttura

questo ovviamente ti comporterà un problema e cioè che gli spazi verranno
conteggiati come nuove parole e quindi avrai tante righe quanti spazi

con la nuova versione che trovi qui quel problema è risolto.

luca981
il programma funziona .
#include<stdio.h>
main()
{
   int max_riga=20;
   int max_colonna=20;

   int lung=0;           
   int stri=0;
   int spaz=0;
   char c;         
   int i;

   char input[max_riga][max_colonna];
   while ((c = fgetc(stdin)) != '\n')
   {
      if (c == ' ')
      {
         if(spaz==1)     
         {
            lung=0;
            stri++;
            spaz=0; 
         }
      }
      else
      {   
         spaz=1;   
         input[stri][lung] = c;
         input[stri][lung+1] = '\0';
         lung++;
      }
   }
   printf("--------------------------------------------\n");
   for(i=0;i<stri+1;i++)
   printf(">>%s\n", input[i]);
} 

il programma funziona .
ma non mi soddisfa :
perchè quando io scrivo :
"    La mamma è andata a fare la spesa        "

essendoci degli spazzi finali, il programma crea una riga vuota finale.
>>La
>>mamma
>>è
>>andata
>>a
>>fare
>>la
>>spesa
>>

ho provato ha modificarlo .
devo inserire un variabile che indica l'inizzio di una parola .
:oops: :cry:
grazzie ancora della pazienza

Umby2
Questo problema nasce dal fatto che incrementi stri appena incontri uno spazio senza chiederti se poi esiste o meno una parola successiva.
Quindi stri sarà sempre di una unità più grande, pertanto potresti risolvere semplicemente modificando il ciclo finale dove hai messo il (stri + 1) in (stri)

luca981
#include<stdio.h>
main()
{
   int max_riga=20;
   int max_colonna=20;

   int lung=0;           
   int stri=0;
   int spaz=0;
   char c;         
   int i;

   char input[max_riga][max_colonna];
   while ((c = fgetc(stdin)) != '\n')
   {
      if (c == ' ')
      {
         spaz=1;   
      }
      else
      {   
         input[stri][lung] = c;
         input[stri][lung+1] = '\0';
         lung++;
         if(spaz==1)     
         {
            lung=0;
            stri++;
            spaz=0; 
         }
      }
   }
   printf("--------------------------------------------\n");
   for(i=0;i<stri+1;i++)
   printf(">>%s\n", input[i]);
} 

domani gli do un ochiata meglio . :?
--------------------------------------------
>>l
>>am
>>ammah
>>af
>>attol
>>as
>>pesa

luca981
era li for sbagliato !.
for(i=0;i<stri+1;i++) 

io guardavo da un altra parte !
grazie

Umby2
l'avevo scritto.... :smt017

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.