Funzione getline.

di il
24 risposte

Funzione getline.

Nel replicare il seguente programma:

#include <stdio.h>
#define MAXLINE 1000

 int getline(char[], int maxline);
 void copy (char to[], char from[]);

int main() {
 int len;
 int max;
 char line[MAXLINE];
 char longest[MAXLINE]

 max = 0;
 while((len = getline (line, MAXLINE))>0)
     if(len>max){
         max=len;
         copy(longest, line);
     }
 if (max>0)
   printf("%s", longest);
 return 0;
}
int getline(char s[], int lim)
{
    int c, i;

    for(i=0; i<lim-1 && (c=getchar()) !=EOF && c!='\n'; i++)
        s[i]=c;
    i++;
}
s[i] = '\0';
return i;

}
void copy(char to[], char from[])
{
    int i;
    i=0;

    while((to[i]=from[i]) != '0')
        i++;
}
Ho la quantità di 7 Warning e mi chiedo come è possibile, dal momento che ho replicato il programma dal testo che utilizzo!?!?

Adesso mi chiedo, sarà che l'autore del testo utilizza un altro software e non CLion?

Per risolvere il problema che credo si tratti sulla funzione getline().... , cosa mi consigliate di fare?

Forse sarà un problema di Librerie che non ho chiamato in testa al Codice?
E in tal caso, quale libreria dovrei richiamare?

24 Risposte

  • Re: Funzione getline.

    Il codice va messo nel tag code, non colorato di blu.

    Alcuni ambienti di programmazione possono dare dei warning che altri non danno o che hanno disabilitato di default. Puoi riportarne il testo?
  • Re: Funzione getline.

    Ho letto il regolamento, ma dove si trova il Code a cui ti riferisci?
    Sono nuovo del forum e devo imparare, perdonatemi!
  • Re: Funzione getline.

    Nella finestra del forum usa il tasto </>

    Per il problema, prova a chiamare la funzione in altro modo, ad esempio getlin
  • Re: Funzione getline.

    Adesso ho capito!
     
     #include <stdio.h>
    #define MAXLINE 1000
    
     int getline(char[], int maxline);
     void copy (char to[], char from[]);
    
    int main() {
     int len;
     int max;
     char line[MAXLINE];
     char longest[MAXLINE]
    
     max = 0;
     while((len = getline (line, MAXLINE))>0)
         if(len>max){
             max=len;
             copy(longest, line);
         }
     if (max>0)
       printf("%s", longest);
     return 0;
    }
    int getline(char s[], int lim)
    {
        int c, i;
    
        for(i=0; i<lim-1 && (c=getchar()) !=EOF && c!='\n'; i++)
            s[i]=c;
        i++;
    }
    s[i] = '\0';
    return i;
    
    }
    void copy(char to[], char from[])
    {
        int i;
        i=0;
    
        while((to[i]=from[i]) != '0')
            i++;
    } 
     
    Ecco qui!
    Adesso faccio la prova a scrivere getlin!

    Problema risolto con la sostituzione di getline con getlin, solo che adesso mi restano 5 Warning!

  • Re: Funzione getline.

    Mostra i warning ...
  • Re: Funzione getline.

    ====================[ Build | VettoriDiCaratteri | Debug ]======================
    /snap/clion/180/bin/cmake/linux/bin/cmake --build /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/cmake-build-debug --target VettoriDiCaratteri
    [1/2] Building C object CMakeFiles/VettoriDiCaratteri.dir/main.c.o
    FAILED: CMakeFiles/VettoriDiCaratteri.dir/main.c.o
    /usr/bin/cc -g -std=gnu99 -MD -MT CMakeFiles/VettoriDiCaratteri.dir/main.c.o -MF CMakeFiles/VettoriDiCaratteri.dir/main.c.o.d -o CMakeFiles/VettoriDiCaratteri.dir/main.c.o -c /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c: In function ‘main’:
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:13:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘max’
    13 | max = 0;
    | ^~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:14:24: warning: passing argument 1 of ‘getline’ from incompatible pointer type [-Wincompatible-pointer-types]
    14 | while((len = getline (line, MAXLINE))>0)
    | ^~~~
    | |
    | char *
    In file included from /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:1:
    /usr/include/stdio.h:616:45: note: expected ‘char ** restrict’ but argument is of type ‘char *’
    616 | extern __ssize_t getline (char **__restrict __lineptr,
    | ~~~~~~~~~~~~~~~~~~^~~~~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:2:17: warning: passing argument 2 of ‘getline’ makes pointer from integer without a cast [-Wint-conversion]
    2 | #define MAXLINE 1000
    | ^~~~
    | |
    | int
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:14:30: note: in expansion of macro ‘MAXLINE’
    14 | while((len = getline (line, MAXLINE))>0)
    | ^~~~~~~
    In file included from /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:1:
    /usr/include/stdio.h:617:46: note: expected ‘size_t * restrict’ {aka ‘long unsigned int * restrict’} but argument is of type ‘int’
    617 | size_t *__restrict __n,
    | ~~~~~~~~~~~~~~~~~~~^~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:14:15: error: too few arguments to function ‘getline’
    14 | while((len = getline (line, MAXLINE))>0)
    | ^~~~~~~
    In file included from /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:1:
    /usr/include/stdio.h:616:18: note: declared here
    616 | extern __ssize_t getline (char **__restrict __lineptr,
    | ^~~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:17:15: error: ‘longest’ undeclared (first use in this function)
    17 | copy(longest, line);
    | ^~~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:17:15: note: each undeclared identifier is reported only once for each function it appears in
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c: At top level:
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:31:3: error: ‘i’ undeclared here (not in a function)
    31 | s = '\0';
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:31:1: warning: data definition has no type or storage class
    31 | s = '\0';
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:31:1: warning: type defaults to ‘int’ in declaration of ‘s’ [-Wimplicit-int]
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:32:1: error: expected identifier or ‘(’ before ‘return’
    32 | return i;
    | ^~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:34:1: error: expected identifier or ‘(’ before ‘}’ token
    34 | }
    | ^
    ninja: build stopped: subcommand failed.
  • Re: Funzione getline.

    Per la 13, guarda cosa non va nella linea precedente

    Pe la linea 17, mi sembra ovvio che se l'hai chiamata getlin devi corregere anche la chiamata a getline(...)

    Per il resto, controlla le parentesi }
  • Re: Funzione getline.

    Per la 13, non riesco a trovare il problema!
    Cosa ci sarà di sbagliato?

    Per la 17 ho sistemato.

    Per la parentesi ho sistemato.

    Ma ho ancora errori.

    Ecco il programma:
    #include <stdio.h>
    #define MAXLINE 1000
    
     int getlin(char[], int maxline);
     void copy (char to[], char from[]);
    
    int main() {
        int len;
        int max;
        char line[MAXLINE];
        char longest[MAXLINE]
    
        max = 0;
        while ((len = getlin(line, MAXLINE)) > 0)
            if (len > max) {
                max = len;
                copy(longest, line);
            }
    
        if (max > 0)
            printf("%s", longest);
        return 0;
        {
            int getlin(char s[], int lim)
    
            int c, i;
            for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
                s[i] = c;
            if (c == '\n') {
                i++;
            }
            s[i] = '\0';
            return i;
        }
    
    
        void copy(char to[], char from[]) {
            int i;
            i = 0;
    
            while ((to[i] = from[i]) != '0')
                i++;
        }
    }


    Ecco i Warning:

    ====================[ Build | VettoriDiCaratteri | Debug ]======================
    /snap/clion/180/bin/cmake/linux/bin/cmake --build /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/cmake-build-debug --target VettoriDiCaratteri
    [1/2] Building C object CMakeFiles/VettoriDiCaratteri.dir/main.c.o
    FAILED: CMakeFiles/VettoriDiCaratteri.dir/main.c.o
    /usr/bin/cc -g -std=gnu99 -MD -MT CMakeFiles/VettoriDiCaratteri.dir/main.c.o -MF CMakeFiles/VettoriDiCaratteri.dir/main.c.o.d -o CMakeFiles/VettoriDiCaratteri.dir/main.c.o -c /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c: In function ‘main’:
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:13:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘max’
    13 | max = 0;
    | ^~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:17:18: error: ‘longest’ undeclared (first use in this function)
    17 | copy(longest, line);
    | ^~~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:17:18: note: each undeclared identifier is reported only once for each function it appears in
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c: In function ‘getlin’:
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:27:9: error: expected declaration specifiers before ‘for’
    27 | for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
    | ^~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:27:21: error: expected declaration specifiers before ‘i’
    27 | for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:27:73: error: expected declaration specifiers before ‘i’
    27 | for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:29:9: error: expected declaration specifiers before ‘if’
    29 | if (c == '\n') {
    | ^~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:32:9: error: expected declaration specifiers before ‘s’
    32 | s = '\0';
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:33:9: error: expected declaration specifiers before ‘return’
    33 | return i;
    | ^~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:34:5: error: expected declaration specifiers before ‘}’ token
    34 | }
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:37:39: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
    37 | void copy(char to[], char from[]) {
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:44:1: error: expected declaration specifiers before ‘}’ token
    44 | }
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:24:13: error: old-style parameter declarations in prototyped function definition
    24 | int getlin(char s[], int lim)
    | ^~~~~~
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:44: error: expected ‘{’ at end of input
    44 | }
    |
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c: In function ‘main’:
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:44:1: error: expected declaration or statement at end of input
    44 | }
    | ^
    /home/antonio/Scrivania/FIle_C_Testo/VettoriDiCaratteri/main.c:44:1: error: expected declaration or statement at end of input
    ninja: build stopped: subcommand failed.


    Non so più come sistemarlo?
  • Re: Funzione getline.

    Per il primo errore ti avevo detto di guardare nella linea precedente.

    Per il resto, ci sono ancora errori sulle parentesi { e }

    Fai attenzione, le { devono corrispondere alle }

    Ma non devi solo copiare il testo? Possibile che non riesci?
  • Re: Funzione getline.

    Allora...., sto trovando errori di Battitura nelle spiegazioni e nei capitoli, penso che ci siano errori di battitura anche nei codici!
    Quindi....
    Se si tratta della lingua Italiana, te ne accorgi subito dell'errore di stampa, ma se si tratta di un codice C++ che si sta imparando, penso che prima di capire l'errore, si deve Imprecare un po'!
    Non so se ho reso l'idea!



    Non mando foto del testo perchè non voglio appesantire il forum, ma credimi, sto solo replicando i programmi per vedere come funzionano e sto trovando problemi!
  • Re: Funzione getline.

    Guarda che quel libro ce l'ho anche io (studiato tanti tanti anni fa) e in questo esercizio (pag. 29) non ci sono errori di stampa ...

    In particolare, leggi bene questa linea

    char longest[MAXLINE];
  • Re: Funzione getline.

    Ho detto che ho trovato errori di battitura nei capitoli e quindi mi vengono anche dubbi se ci sono errori nei codici, visto che non sono ancora esperto.....

    Per quanto riguarda quella linea...., non riesco a capire cosa c'e' che non va?


    Non riesco a capire...., perdonami.
  • Re: Funzione getline.

    Manca il punto e virgola, te l'ha pure detto il compilatore...
    
    expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘max’
    
  • Re: Funzione getline.

    Proverei a ripartire a fare il programma da capo, non è lungo.
    Non penso serva riscrivere fisicamente, anche un copia incolla delle funzioni fermandosi ad ognuna per vedere se è completa e non ci sono errori.

    suggerimento per il caso, lascerei la funzione main per ultima ( non è obbligatorio, ma per oggi proverei ).
Devi accedere o registrarti per scrivere nel forum
24 risposte