View Full Version : [C] stringa in input da confrontare con un caratte
thrillseeka
22nd July 2004, 09:41
ho questo simpatico problemino (certe cose del c non le ho ancora capite)...
devo prendere una stringa in input,controllare che non sia più lunga di 80 caratteri,fare un controllo sulle prime 3 lettere,mettere un segno di riotnro a capo e infine scriverle su un file.
io ho dichiarato
char *mex;
e poi
if(&mex[0]=='A')
ma il compilatore mi dice
esame.c:14: warning: comparison between pointer and integer
consigli?
thrillseeka
22nd July 2004, 10:05
forse ho risolto
char mex[80];
if(mex[0]=='A')
kenshin
22nd July 2004, 12:02
Puoi farlo in 2 modi:
1) lo dichiari come puntatore (come hai fatto tu) e poi allochi dinamicamente lo spazio che ti serve:
char *mex;
mex = malloc(80*sizeof(char));
2) Usi un array.
char mex[80];
Ricorda comunque che se devi prendere in input una stringa e devi controllare la lunghezza, è meglio se allochi un array di dimensione maggiore (ad es 255) e poi controlli la lunghezza con strlen.
In questo modo:
char mex[255];
// scanf, printf ecc
if(strlen(mex) > 80)
{
printf("Stringa troppo lunga\n");
exit(1);
}
else
{
/* controlli sui primi 3 caratteri
* appendi il rimando a capo
* scritture su file
*/
}
Dovrebbe funzionare...
SunBeam
22nd July 2004, 12:58
Vai così Thrill, e che me lo chiedi a me che se vedo un * mi metto paura! :D
thrillseeka
22nd July 2004, 13:14
Originally posted by piedamaro@Jul 22 2004, 12:58 PM
Vai così Thrill, e che me lo chiedi a me che se vedo un * mi metto paura! :D
e io che pensavo che vivessi di puntatori e malloc.... :P
SunBeam
22nd July 2004, 14:09
Sese, oggetti e metodi :D
thrillseeka
22nd July 2004, 14:39
altro problema (quello di prima l'ho risolto)
dovrei scrivere delle stringhe su file di testo,andando a capo e mantenendo quello che c'è scirtto dentro...
fd=open("f1", O_APPEND);
if(fd<0){
perror("opening file");
exit(255);
}
x=strlen(inbuf);
fd=write(fd,inbuf,x);
fd=write(fd,"\n",2);
close(fd);
exit(0);
così non mi scrive nulla nel file,se invece metto O_RDWR mi lascia solo l'ultima stringa.
non c'è un modo per forzare a svuotare subito il buffer della write?temo che lui lo sovrascriva...
Emanem
22nd July 2004, 15:48
<soluzione grezza>
// Questa variabile e' il puntatore alla stringa ANSI con caratteri ASCII
char *ptr;
// Variabile usata come indice
int i = 0;
// Riferimento a file usato dopo
FILE *fp = NULL;
// Verifico che il carattere '\0' (terminatore di stringa) sia contenuto
// solo e soltanto nei primi 80 caratteri.
// All'interno del 'while' incremento la variabile 'i'.
while( i <= 80 && ptr[i++]!='\0') ;
// Controllo che la stringa sia di dimensioni esatte
if (i >= 80) /* fa quello che vuoi ed esci */ exit(0);
// Se non sono uscito allora scrivo nella stringa il carattere '\n' e
// poi appendo il terminatore di stringa '\0'.
// Nella posizione 'i-1' dovrei avere il vecchio '\0'; ci metto il caarttere '\n' e
// poi nella posizione 'i' ci metto il '\0'.
ptr[i-1] = '\n';
ptr[i] = '\0';
// Infine stampo su un file "abc.txt"
// Provo ad aprire lo stream-file in modalita' scrittura testo
fp = fopen("abc.txt", "w");
// Se ho aperto lo stream
if (fp)
{
// Comunque vadano le cose controllo se ho stampato
// o no la stringa.
if (1 != fprintf(fp, "%s", ptr)) /* chuidi lo stream del file ed esci con un errore */;
else /* stampo un messaggio di successo - se mi e' richiesto di farlo */ ;
// Comuqnue chiudo lo stream del file
fclose(fp);
}
// Se invece non riesco ad aprire lo stream del file
// stampo un messaggio di errore.
else /* stampa un messaggio di errore */;
Perdonate errori di ortografia etc etc...
Ho preferito usare le funzioni di alto livello per gestire i files perche' mi sembra piu' semplice in questo caso (e non e' richiesta la protezione file per l'accesso multiplo in lettura/scrittura).
Ciao, Emanem! ;)
thrillseeka
22nd July 2004, 16:17
non c'è un modo per forzare la scrittura su file *immediatamente*?
kenshin
22nd July 2004, 16:40
D'accordissimo con emanem... preferisco anche io le funzioni ANSI di lettura/scrittura file perché portabili... mentre open è un'esclusiva linux...
Se poi vuoi fare append, modifica la riga del codice di emanem in questo modo:
fp = fopen("abc.txt", "a");
Fino ad ora non ho mai avuto problemi di bufferizzazione con le funzioni ANSI... (ovviamente ricordati di fare "fclose" ogni volta che scrivi una riga...)
thrillseeka
22nd July 2004, 17:03
purtroppo devo usare le syscall linux...
se lo sapete potreste indicarmi il mod per scaricare il buffer? (mi ricordo qualcosa tipo flush() ma non sono sicuro)...
pieggi
22nd July 2004, 17:08
Per svuotare il buffer devi fare una flush() :)
thrillseeka
22nd July 2004, 17:35
Originally posted by pieggi@Jul 22 2004, 17:08 PM
Per svuotare il buffer devi fare una flush() :)
devo includere qualche header particolare?
mi da errore in compilazione...
pieggi
25th July 2004, 13:36
Originally posted by thrillseeka+Jul 22 2004, 18:35 PM--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE ( thrillseeka @ Jul 22 2004, 18:35 PM)</td></tr><tr><td id='QUOTE'> <!--QuoteBegin- pieggi@Jul 22 2004, 17:08 PM
Per svuotare il buffer devi fare una flush() :)
devo includere qualche header particolare?
mi da errore in compilazione... [/b][/quote]
uhm.. non ricordo ci volesse qualche include <_<
Aspè che guardo nei sorgenti di un'esame..
EDIT:
No, non lo trovo :(
Però non mi pare ci volesse un include particolare :granata:
SunBeam
25th July 2004, 17:58
Thrill, ma use una qualche ide? (anjuta eclipse etc, etc)?
kenshin
26th July 2004, 10:45
In c++ ti basta aggiungere questo nell'header... e dichiarare il namespace std...
#include <fstream>
Ora in c non so come si usi...
Bosk
27th July 2004, 22:26
O usi una
setbuf(fp, NULL);
(Mi pare sia questo l'ordine dei parametri, non sono un man vivente :P)
una volta aperto il file, o ad ogni fprintf(fp, ...) fai
fflush(fp);
Per gli header, basta il classico <stdio.h>
--
bye, Bosk
oignarf
28th July 2004, 08:35
Mi pare di ricordare fosse fflush() la funzione corretta ANSI
Funzione fflush() (http://mkssoftware.com/docs/man3/fflush.3.asp)
Di solito viene sempre chiamata prima di chiudere uno stream per evitare che non resti nulla nel buffer, anke se non ho mai avuto problemi omettendola.
Note that using fflush is not always necessary; output is flushed automatically when you try to write and the output buffer is already full, when the stream is closed, when the program exits, when an input operation on a stream actually reads data from the file, and of course, when a newline is written to a line-buffered stream. (See fputs, for a code example that uses fflush.)
http://crasseux.com/books/ctutorial/Stream...-buffering.html (http://crasseux.com/books/ctutorial/Stream-buffering.html)
vBulletin® v3.7.0, Copyright ©2000-2009, Jelsoft Enterprises Ltd.