Newsgroup: it.comp.lang.c
Titolo: Pls mi dite perchè queste 10 righe di codice mi danno errore?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
   int i=0;
   char *V;
   scanf("%s", V);
   char *P;
   scanf("%s", P);
   printf("%d\n", strlen(V));
   printf("%d", strlen(P));
   system("pause");
}
Faccio partire il programma e scrivo 
ciao (invio)
casa (invio)
ed al secondo invio ottengo Stinghe.exe has encountered a problem and
needs to close. 
Error signature
AppName: stringhe.exe      
AppVer: 0.0.0.0
ModName: msvcrt.dll
ModVer: 7.0.2600.0
Offset: 00030ab5
Questo è una delle cose strane che mi sono capitate con le
stringhe...le altre provero a  riflettere ma intanto iniziamo da
questa. Se può aiutarvi ho WinXP e uso Dev-C++ della BloodShed ver.
4.9.4.0.
Grazie a tutti in anticipo :)))
ciaooo :)

casa (invio)
benvenuto nel mondo dell'allocazione dinamica, dei buffer overflow e
delle stack corruption.
P.s: aggiungi anche un return, e togli quel system("pause").

 
Ciao. Matic

con malloc ( V = (char*) malloc ( sizof(char) * numerolettere); )
 
arghhhhh
la malloccc....l'avevo completamente dimenticata.
Si vede che sono all'inizio ....quanta strada ancora :)))
Un solo quesito : quel numerolettere dovcrebbe chiaramente essere
dinamico come parametro perchč l'input č da tastiera.
Si puň in qualche modo fare cio? 
Cioč sapere i caratteri immessi e quindi allocare memoria in modo da
non sprecare nulla?
Mi viene in mente di contare le lettere dell'input e poi passare tale
numero alla malloc ma non so se č giusto e se č il piů efficace
metodo.
Grazie 
ciaoo :)))

 metodo.
Non si può fare.
In genere si ha una mezza idea di quanto potrebbe essere lunga la stringa,
e si alloca la memoria di conseguenza.
in caso contrario, potresti fare una cosa del genere
1) allochi (per esempio) memoria per 50 caratteri
2) inizi un ciclo in cui prendi un carattere per volta
ad ogni pressione di un tasto salvi il carattere in un array e
 aumenti un contatore
3)quando il contatore è arrivato a 49 riallochi la stringa 
 di 50+ 20, 30 o 10000 
4)riazzeri il contatore e rifai la stessa cosa quando raggiunge la cifra
aggiunta
Per esempio.
Ciao,
Riccardo

in caso contrario, potresti fare una cosa del genere
"in genere" questo portà ad una vunlerabilità molto nota!!!
e dio ce ne scampi!!!!!

Grazie mille per l'aiuto :)))) 
ciaooo

 
perfetto, ma dimmi come non fare apparire questo:
$ gcc -o a aa.c
aa.c: In function `main':
aa.c:5: warning: assignment makes pointer from integer without a cast
in questo sorgente:
#include <stdio.h>
int main()
{
        char *V;
        V = malloc(15);
        scanf("%s", V);
        printf("Stringa: %s\n", V);
}

> }
A  dire  il  vero main  e`  una  funzione  un  po' particolare:  se  non
viene  specificato  il  valore   di  ritorno  il  compilatore  inserisce
automaticamente un return 0.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
K.R.O.N.O.S
Kinetic Replicant Optimized for Nocturnal Observation and Sabotage

}
#include <stdlib.h>
Se in C89, se non specifichi il protopito il compilatore assume
ritorni int. Nel tuo caso il compilatore pensa tu voglia assegnare un
int (presunto valore di ritorno della malloc se non includi stdlib.h)
a un char *, cosa ovviamente non fattibile senza cast.
Il cast e' un refuso del massato, quando la malloc ritornava un char
*, e anche allora NON andava fatto quando assegnavi a un char * :P
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 e anche allora NON andava fatto quando assegnavi a un char * :P
eh ?

eh ?
Mi spiego meglio.
Il cast si fa' quando devi assegnare il tipo_1 al tipo_2 e:
- i due tipi sono diversi
- dal tipo_1 al tipo_2 non esiste alcuna conversione implicita.
Se la vecchia versione della malloc ritornava un char * e tu devi
assegnare il risultato a un char * concorderai con me sull'inutilita'
del cast (violano la prima delle condizioni di cui sopra) :)


 e dio ce ne scampi!!!!!
man fgets
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscali.it

 in mezzo a una funzione
Perché lui (mi gioco le palle che usa Dev-C++, quel system("pause") è
famoso) compila in C++; tra l'altro, se usa Dev-c++ allora usa gcc, che è il
compilatore usato da quel programma. Oppure perché è C99(ma non penso, quel
gcc non è così aggiornato). Ciao
--
Paolo Giarrusso
Per rispondere togliere solo "TOGLIMI" dall'indirizzo, non _spam.

 >> e anche allora NON andava fatto quando assegnavi a un char * :P
ma assolutamente no. il cast si usa perché un programma C è quasi corretto
in C++; aggiungendo quel cast, i prototipi e evitando l'int implicito(spero
di non dimenticare niente) allora è corretto anche in C++. Per nessun altro
motivo. Eventuali risposte su un thread del tipo "Cast su malloc", non qui.


motivo. Eventuali risposte su un thread del tipo "Cast su malloc", non qui.
Forse c'e' un'incomprensione.
Tu dici che il cast serve solo per compatibilita' con il C++? Spero di
no, visto che il cast e' stato inventato prima che fosse mai concepito
il C++ :P
Il cast serve per assegnare tra di loro 2 tipi per cui non vi sia una
conversione implicita.
A meno che tu non stia dicendo di effettuare comunque il cast, anche
dove non serve perche' un sorgente C compili direttamente in C++... il
che non e' corretto: se programmi in C usi le regole del C, se compili
in C++ quelle del C++, sarabbe un errore mischiare le 2 cose, se ne e'
parlato abbondantemente... in C++ funziona perche' hai tanti tipi di
cast per varie situazioni ed e' un linguaggio fortemente tipato... in
C hai solo il cast brutale che uccide tutti i controlli sui tipi (che
se non sbaglio corrisponde al terzo e piu' brutale tipo di cast in
C++) e contemporaneamente non e' fortemente tipato come il C++.


automaticamente un return 0.
stiamo parlando di C o di C++?

>> >> * :P
ma l'espresionne "refuso del massato" che vuol dire ? :PP

 stiamo parlando di C o di C++?
C99 e C++
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"L'ottimista pensa che questo sia il migliore dei mondi possibili. 
 Il pessimista sa che e` vero" -- J. Robert Oppenheimer

 C++) e contemporaneamente non e' fortemente tipato come il C++.
Beh, intanto si usa così, per questo motivo e non per altri(l'ho letto su C-
Guida Completa, ora non ricordo la casa e autore). Che non sia corretto
potrebbe essere giusto, ma se volessi usare quel codice in C++, la
compatibilità è utile. Io personalmente, nei pochi programmini che faccio,
uso il C++ anziché il C solo per avere un buon type-checking(o meglio per
averne uno), ma i programmi che faccio sarebbero spesso compilabili anche in
C(bisogna dire che si tratta di programmini piccolissimi, e non avrebbe
senso la OOP su 100 righe o meno). Ciao


Guida Completa, ora non ricordo la casa e autore).
Ne ho trovati 2:
 - "C 3/ed Guida completa" by Herbert Schildt 
 - "Programmare in C Guida completa" by Peter Aitken, Bradley L. Jones
Spero per te che non fosse il primo: l'autore piu' ignorante in
materia di programmazione, C, C++ e Java.
Se era il secondo non lo conosco personalmente, ma i commenti sono
piuttosto neutrali... ma non so dirti il perche', ho il sospetto che
sia il primo... sara' perche' riconosco il tocco di Schildt.
