2012-11-04 11 views
5

Possible Duplicate:
Learning C by K&R, error when trying to compile programs from book with arrays and function callsprecedente dichiarazione di 'funzione' stato qui in C

Mentre l'apprendimento The C Programming Language di Brian W. Kernighan e Dennis M. Ritchie, ho provato l'esempio nella sezione di 1,9 array di caratteri. Ecco i codici:

/* read a set of text lines and print the longest */ 

#include <stdio.h> 
#define MAXLINE 1000 /* maximum input line length */ 

/* declare functions: getline() and copy() */ 
int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

/* getline: read a line into array "s", return length */ 
int getline(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"){ 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; /* the null character whose value is 0 */ 
    return i; 
} 

/* copy: copy 'from' into 'to'; assume to is big enough */ 
/* the return type of copy is "void" -- no value is returned */ 
void copy(char to[], char from[]) 
{ 
    int i; 
    i = 0; 
    while ((to[i] = from[i]) != '\0') /* terminated with a \0 */ 
     ++i; 
} 

/* print the longest input line */ 
int main() 
{ 
    int len; /* current line length */ 
    int max; /* maximum length seen so far */ 
    char line[MAXLINE]; /* current input line */ 
    char longest[MAXLINE]; /* longest line saved here */ 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) 
    if (len > max) { 
     max = len; 
     copy(longest, line); 
    } 
    if (max>0) /* there was a line */ 
     printf("%s", longest); 
    return 0; 
} 

Ci sono due errori principali:

  1. errore: conflitto tipi per 'getline'
  2. errore: precedente dichiarazione di 'getline' stato qui

L'elenco completo degli errori è qui:

/Users/C/Codes/Ritchie/array_char.c:8: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here 
/Users/C/Codes/Ritchie/array_char.c:13: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here 
/Users/C/Codes/Ritchie/array_char.c: In function ‘getline’: 
/Users//C/Codes/Ritchie/array_char.c:17: warning: comparison between pointer and integer 
/Users/C/Codes/Ritchie/array_char.c:17: warning: comparison with string literal results in unspecified behavior 

Non sono sicuro di cosa sia andato storto, dal momento che è esattamente lo stesso codice del libro. Forse la dichiarazione delle funzioni all'inizio:

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

è problematico? Grazie!

+1

Si prega di inviare il messaggio di errore effettivo (non parafrasare) – CrazyCasta

+0

C'è un motivo per fare tutto nel modo più difficile qui, o si potrebbe usare 'fgets' e' strcpy' invece? –

risposta

8

http://www.kernel.org/doc/man-pages/online/pages/man3/getline.3.html

getline esiste già in stdio.h. Ecco perché stai ricevendo l'errore. Cambia il nome della funzione in qualcos'altro come getline_my.

Inoltre, si sta confrontando un personaggio con una stringa in linea 16. Dovrebbe essere
if(c == '\n')

NON

if(c == "\n")

+0

Buona individuazione! Immagino che l'OP abbia digitato il codice. –

+0

Bene, l'OP ha digitato il codice. Sta leggendo un libro: P – CrazyCasta

+0

@Neo: grazie per averlo indicato! – alittleboy

4

Il problema è che è probabile che sia disponibile una definizione di getline in stdio.h. Sulla mia versione di linux c'è una funzione getline fornita dalla libreria C (penso che parte dello standard POSIX sia mia opinione). Non puoi avere due funzioni con lo stesso nome in C, e questo è il tuo problema. Prova a rinominare la tua versione di getline a my_getline (sia dove lo dichiari/definisci e dove lo usi).

1

Dalla data in cui tale libro è stato scritto fino ad oggi la La libreria C standard è leggermente modificata e non sono più coerenti con la vecchia e la nuova.

È necessario rimuovere le dichiarazioni e lasciare le dichiarazioni dallo stdio.h corrente.

+0

Questo non è il cambiamento standard.È da gcc che non si conforma allo standard. –

+0

Potrebbe leggere la seconda edizione, che è stata aggiornata ad ANSI C, che dovrebbe essere compilata su qualsiasi compilatore C. (Inoltre, il codice che ha scritto dovrebbe essere eseguito su qualsiasi compilatore C oltre al fatto che il nome della funzione è già utilizzato, quindi ha bisogno di cambiarlo). – CrazyCasta

+0

sì, l'attuale gcc è c89 per impostazione predefinita, a meno che non si inserisca -c99. anche il C11 è apparso. – alinsoar

2
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here 

E 'esattamente come si dice: getline è dichiarato nel stdio.h (perché la libreria standard fornisce una funzione con lo stesso nome). Non è possibile fornire la propria funzione con quel nome, perché quando si chiama getline, il compilatore non saprebbe quale utilizzare.

Problemi correlati