PDA

View Full Version : [C++] La funzione strdup mi restituisce "bool" invece che un puntatore


Dani88
13-01-2008, 09:44
Raga sono agli inizi della programmazione in linguaggio C e C++, mi si è presentato questo problema:
ho creato la funzione (presa da un esempio fatto dal mio prof che funziona)

char *leggi_str(FILE *file_di_input)
{
char str[100];
int i = 0;
char c;

// Leggi caratteri e inserisci nella stringa sino allo spazio
while ( i < 99 && (c=getc(file_di_input)) != ' ' && c != '\n' && c != EOF )
str[i++] = c;
// Termino la stringa
str[i] = EOS;
// Se sono in fondo al file e non ho letto nulla termino
if ( c==EOF && i==0 )
return NULL;
//altrimenti restituisco copia della stringa letta
else
return strdup(str);
}


Quando però la richiamo nel main in tal modo mi da errore
#include<iostream>
using namespace std;
#include "funzioni.h"
#include <string>


int main()
{
char *s1=NULL;
FILE *prova;

prova=fopen("H:\\Università\\Fondamenti Informatica\\Programmi Miei\\prove varie\\prova.txt","r");
while ((s1=leggi_str(prova)!=NULL))
//cout<<s1;

return 1
}

Quando compilo, mi dice che, nella riga in grassetto, non può convertire da bool a char *, ma la funzione non restituisce bool, ma un puntatore alla stringa che ha duplicato...
Tra l'altro nell'esempio fatto dal mio prof funziona perfettamente ed è la stessa sintassi. :help: :help: :help:

cionci
13-01-2008, 09:56
while ((s1=leggi_str(prova))!=NULL)

Certo che brutto questo miscuglio di C e C++ ;)

Dani88
13-01-2008, 10:03
ma infatti qst mio prof è troppo suonato, figurati che ho dovuto farmi spiegare le struct dall'assistente di laboratorio (faccio ing informatica) xkè nn ci avevo capito un tubo. Qui ha usato questa funzione self-made:D solo perchè nn si poteva usare <string.h> (era un vecchio esame in cui erano ammesse sl lib di in/out) sennò era presto risolto senza fare tutto sto casino...

Cmq grazie davvero :D ma in pratica xkè senza parentesi non andava? Cioè faceva il controllo prima di assegnare a s1 l'indirizzo del puntatore?

cionci
13-01-2008, 10:06
La aprentesi c'era, ma era in fondo ;)
In ogni caso l'operatore != aveva precedenza sull'operatore = ed effettuava prima il confronto ritornando un bool e poi lo assegnava ad s1.
In ogni caso bastava usare fscanf o fgets al posto di quella funzione ;)

Dani88
13-01-2008, 10:28
io infatti l'avrei fatto con fscanf ma boh...guardando la soluzione dell'esame mi aveva colpito questa cosa e allora mi ci sono messo a cercare di capire un po :D

71104
13-01-2008, 10:32
ma infatti qst mio prof è troppo suonato, figurati che ho dovuto farmi spiegare le struct dall'assistente di laboratorio (faccio ing informatica) xkè nn ci avevo capito un tubo. Qui ha usato questa funzione self-made:D solo perchè nn si poteva usare <string.h> (era un vecchio esame in cui erano ammesse sl lib di in/out) sennò era presto risolto senza fare tutto sto casino... in C++ non devi includere <string.h>, ma <cstring>