Newsgroup: it.comp.lang.c
Titolo: caratteri strani

In questo programma che crittografa una frase c'e' un strano problema. Ho
sfruttato un semplice algoritmo, ovvero quello di far slittare i caratteri
di 'n' posti. Inserendo certe frasi funziona, inserendone altre mi aggiunge
dei caratteri strani alla fine della frase. Non ho la minima idea di quale
possa essere la causa.
#include <stdio.h>
#include <string.h>
void main()
{
    int n,i;
    char frase1[20], frase2[20];
    printf("\nInserisci un numero: ");
    scanf("%d%*c",&n); /* Il %*c serve per pulire il buffer di tastiera  */
    printf("Inserisci una frase: ");
    gets(frase1);
    for(i=0; i<strlen(frase1); i++)
        if (frase1[i]>='a' && frase1[i]<='z') /* sto supponendo che si
                                                inseriscano solo minuscole!
*/
            if ((frase1[i]+n)>'z') frase2[i]=(frase1[i]+n-'z'-1)+'a';
            /* qui controlla se il nuovo carattere supera la 'z',
               in tal caso ricomincia dalla 'a' */
            else frase2[i]=frase1[i]+n;
        else frase2[i]=frase1[i]; /* tutti i caratteri escluse le lettere,
                                     vengono copiati tali e quali */
    printf("Frase crittata:\n");
    puts(frase2);
    getchar();
}

 possa essere la causa.
Io si!
Non metti il '\0' in fondo a frase2!
Tommy

> Non metti il '\0' in fondo a frase2!
Ok, grazie! Scusate l'ignoranza :)

    gets(frase1);
Mischiare scanf() e gets() nello stesso codice e` una tecnica foriera
di guai.  Usa fgets() e vai sul sicuro.
-- 
Andrea Laforgia
#exclude <windows.h>

 di guai.  Usa fgets() e vai sul sicuro.
Ma fgets() non e' analoga a gets() ?

Ma fgets() non e' analoga a gets() ?
No.


 Ma fgets() non e' analoga a gets() ?
No, fgets accetta anche il numero di caratteri da leggere:
char *fgets (char *s, int n, FILE *stream);
fgets legge al piu' n-1 caratteri e poi aggiunge in fondo il '\0'.
La prima cosa puntualizzata da Andrea e' contro lo standard. La seconda e'
una preferenza personale sua che cmq condivido.
Ad ogni modo non erano queste due cose a far stampare i caratteri strani al
tuo programma.
Tommy

 Ma fgets() non e' analoga a gets() ?
No, fgets accetta anche il numero di caratteri da leggere:


 </QUOTE>
Come dice Angelo:
|qualsiasi altra forma (comprese main() o int main()) puo'
|essere accetta dal compilatore, ma NON E' STANDARD [1].
"int main()" non e' standard!
Tommy

 "int main()" non e' standard!
Che pero' si e' appena accorto di aver sbagliato. :-)
Per lo meno e' standard secondo C89.
http://www.faqs.org/faqs/C-faq/faq/
See questions 11.12a to 11.15. 
Sorry.
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Che pero' si e' appena accorto di aver sbagliato. :-)
Infatti, int main() e` standard sia in C89 che in C99.


 Che pero' si e' appena accorto di aver sbagliato. :-)
<QUOTE>
==============
       5.1.2.2.1  Program startup
       [#1] The function called at program startup is  named  main.
       The  implementation declares no prototype for this function.
       It shall be defined with a return type of int  and  with  no
       parameters:
               int main(void) { /* ... */ }
       or  with  two parameters (referred to here as argc and argv,
       though any names may be used,  as  they  are  local  to  the
       function in which they are declared):
               int main(int argc, char *argv[]) { /* ... */ }
       or  equivalent;8)   or  in some other implementation-defined
       manner.
==============
</QUOTE>
A prima lettura sembrerebbe che "int main()" non sia valido. Ma visto che
sono equivalenti, da cio' deriva che anche "int main()" e' valido.
Tommy

 wrote in message
news:b0h1kl$koj$1...@helle.btinternet.com...


Ma non e' facoltativo, il "void", se una funzione non ha parametri?
Non ricordo se con la nuova versione, C99, ci sia la stessa
distinzione che c'e` in C++.  In C++, se una funzione non ha
parametri, basta dichiararla senza argomenti, cosa che in C (almeno
nel K&R classico) avrebbe significato: "con un numero imprecisato di
parametri" (che e` diverso).
Quindi int main(void) e int main(), in C++, sono equivalenti.


"Andrea Laforgia" <x@x.x> wrote in message
news:5m7o2v884936ht1nh...@4ax.com...

Ah, ecco, mi sembrava^^
Sono un programmatore C++, non ho mai imparato il C "puro" (se vedo un
linguaggio senza oggetti di solito svengo), per cui ricordavo qualcosa a
riguardo, ma senza precisione.
Che in C++ fossero equivalenti lo sapevo, pero' (emmenomale). Non sapevo
invece che in C significasse tutt'altro.

 sono equivalenti, da cio' deriva che anche "int main()" e' valido.
int main() va bene solo se usato in fase di definizione.
[1]
6.7.5.3 Function declarators
14- An identifier  list declares only the identifiers  of the parameters
of the function. An empty list in  a function declarator that is part of
a  definition  of that  function  specifies  that  the function  has  no
parameters. The empty list in a function  declarator that is not part of
a definition  of that function  specifies that no information  about the
number or types of the parameters is supplied.
Tuttavia una nota rimanda qui`:
6.11 Future Language directions
6.11.6 Function declarators
1-  The  use  of  function   declarators  with  empty  parentheses  (not
prototype-format parameter type declarators) is an obsolescent feature.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non sempre quello che viene dopo e` progresso.
Alessandro Manzoni

int main() va bene solo se usato in fase di definizione.
...che e` poi l'uso che se ne dovrebbe fare nel 100% dei casi.


 ...che e` poi l'uso che se ne dovrebbe fare nel 100% dei casi.
Vero, ma mi e` anche capitato di vederlo insieme ai prototipi delle
altre funzioni... non si sa mai ;)
Kronos
-- 
Home: 
http://kronoz.cjb.net
Let me make your mind, leave yourself behind
Be not afraid