View Full Version : [C] caratteri accentati con PRINTF
Ciao a tutti!! premettendo che sn neofita di programmazione, sto iniziando ad imparare dal linguaggio C per farmi un po' le ossa..
Chiedo a tutti voi .. come si fa a passare alla funzione printf caratteri accentati da stampare a video?
Non ne vengo fuori neanche con Mr Google..
Grazie in anticipo!! ;)
Ciao a tutti!! premettendo che sn neofita di programmazione, sto iniziando ad imparare dal linguaggio C per farmi un po' le ossa..
Chiedo a tutti voi .. come si fa a passare alla funzione printf caratteri accentati da stampare a video?
Non ne vengo fuori neanche con Mr Google..
Grazie in anticipo!! ;)Il problema non è tanto quello di inserire un carattere "speciale" all'interno di una stringa "C". Il problema è comprendere la questione dei set di caratteri.
Faccio un esempio pratico:
tramite un editor in Windows (quello interno del VC++, se usi questo IDE, oppure il blocco note, o altro) scrivi questo codice:
#include <stdio.h>
int main (void)
{
printf ("à\n");
return 0;
}
Poi compilalo (come eseguibile Win32 per console) e lancialo da un prompt dei comandi.
Ecco l'output (io ho creato un prova.exe):
http://img299.imageshack.us/img299/2043/provacar5zf.gif
Stampa la lettera "ó" ... perché???
Semplice. Windows, almeno nel nostro paese, usa il set di caratteri WIN-1252 (detto anche CP-1252). La console del prompt dei comandi usa invece il set di caratteri CP-437 (anche chiamato OEM o IBM-PC).
I due set di caratteri sono diversi. La lettera "a" con accento grave è il codice 0xE0 per il WIN-1252 mentre è il codice 0x85 per il CP-437.
Il set di caratteri della console si può modificare ma supponendo, come è tipico, che usi il set CP-437, per stampare una "a" con accento grave si può fare:
#include <stdio.h>
int main (void)
{
printf ("\x85\n");
return 0;
}
Purtroppo la problematica dei set di caratteri è una problematica abbastanza grossa. L'unica cosa da fare, in questi casi, è capire/sapere dove un carattere dovrà essere stampato e con quale set di caratteri.
Di set di caratteri ce ne sono davvero tanti (troppi ;) ). Dai una occhiata qui (http://en.wikipedia.org/wiki/Character_encoding) solo per avere una idea!
Grazie mille per la pazienza.. quindi è un discorso di seti di caratteri..
Asci centra qualcosa o sono fuori strada?
ho provato a modificare la stringa ed al posto di è ho digitato \x85 ma mi stampa à..
Vado su wiki a vedere se combino..che rompimento però questo problema..
Grazie mille per la pazienza.. quindi è un discorso di seti di caratteri..
Asci centra qualcosa o sono fuori strada?Il set di caratteri ASCII rappresenta solo i primi 128 caratteri (da 0 a 127) ed è praticamente la "base" per ogni sistema informatico. In pratica, detto in altre parole, non esiste alcuna confusione sul significato dei caratteri da 0 a 127. È il codice ASCII e basta.
Il problema sono tutti gli altri set di caratteri, che danno un significato diverso ai caratteri da 128 a 255.
Se tu imposti la console di Windows in CP-437 oppure in CP-850, i primi 128 caratteri sono e restano uguali, quello che cambia sono i 128 caratteri speciali appunto da 128 a 255.
ho provato a modificare la stringa ed al posto di è ho digitato \x85 ma mi stampa à..Certo ... ho anche fatto l'esempio.
Se sei nelle seguenti condizioni:
a) Devi stampare sulla console
b) La console usa il CP-437
Per stampare la "è" devi usare \x8A.
Comunque basta che vai su Wikipedia oppure cerchi "CP-437" con google e trovi subito la mappa dei caratteri.
Ti ripeto il grazie per la pazienza..
OK ho combinato, prima ero stato disattento..
C'è anche una cosa che puoi fare: vedere quale code-page è in uso nella console.
Basta usare il comando:
mode con: cp /status
Sul mio sistema in effetti mi segnala che ho il CP-850. :rolleyes:
CP-437 e CP-850, non vorrei sbagliare, sono abbastanza simili. Dovrei vedere bene le due mappe, comunque per quanto riguarda le lettere accentate (àèìòù áéíóú) dovrebbero essere uguali.
Diciamo che il CP-437 è valido in america, mentre in Europa il CP-850 è forse più appropriato.
mi dice 850Infatti ... Windows versione italiana imposta il CP-850 per default nella console.
Comunque ho verificato le mappe della 437 e 850: le 10 lettere accentate sono nello stesso posto.
Inizio a pensare che programmare in c sia abbastanza uno sbattimento se devi stare sempre attento anche a queste cosette..
Sto facendo un corso di sviluppo software e iniziamo dal c per proseguire poi sulla piattaforma dot net con c#...
Speriamo di nn fare casino..
Per adesso siamo arrivati ai cicli while e for..siamo proprio all'inizio..
Io lavoro e sono da sempre sistemista windows e tecnico di rete.
Sono certificato Cisco.
Questa è la mia prima esperienza di programmazione percui accetto aiuti e consigli a valanga.. ;)
Tu programmi per lavoro?
Inizio a pensare che programmare in c sia abbastanza uno sbattimento se devi stare sempre attento anche a queste cosette..Beh ... no dai ... sbattimento non proprio. ;)
Tieni presente che la questione dei set di caratteri è una cosa che non centra direttamente con i vari linguaggi di programmazione in sé.
È un problema strettamente legato ai vari dispositivi di output e alle loro limitazioni per quanto riguarda la rappresentazione dei caratteri ed è una cosa generale. Hai gli stessi problemi nella console di Linux, ad esempio.
Il linguaggio Java, per fare un altro esempio, supporta in modo nativo i caratteri Unicode (caratteri a 16 bit) ma se provi questo programma:
public class Prova {
public static void main (String[] args) {
System.out.println ("àèìòù áéíóú");
}
}e lo lanci dal prompt dei comandi, hai lo stesso identico problema: l'output è questo:
ÓÞý‗¨ ßÚݾ·
Se invece provi questo programma Java:
import java.awt.*;
import javax.swing.*;
public class FrameTest extends JFrame {
public FrameTest () {
super ("Prova caratteri");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (150, 60);
JLabel label = new JLabel ("àèìòù áéíóú");
getContentPane ().add (label);
}
public static void main (String[] args) {
FrameTest f = new FrameTest ();
f.setVisible (true);
}
}ottieni come output questa finestra:
http://img93.imageshack.us/img93/7332/provacar7mh.gif
e come vedi i caratteri sono ok.
Sto facendo un corso di sviluppo software e iniziamo dal c per proseguire poi sulla piattaforma dot net con c#...
Speriamo di nn fare casino..
Per adesso siamo arrivati ai cicli while e for..siamo proprio all'inizio..
Io lavoro e sono da sempre sistemista windows e tecnico di rete.
Sono certificato Cisco.
Questa è la mia prima esperienza di programmazione percui accetto aiuti e consigli a valanga.. ;) Guarda, anche in base alle mie esperienze personali, posso dirti che se impari bene (ma dico proprio bene) il linguaggio "C", hai poi sicuramente una buona base.
Ma questa è una mia opinione personale. Altri potrebbero dirti che per iniziare a programmare bisogna partire da Java o da altro ancora.
Tu programmi per lavoro?Sì.
Sapresti quando hai voglia spiegarmi che differenza c'è nel passaggio per riferimento e per valore ad una funzione in C?
Non l'ho capito completamente.
Grazie
Sapresti quando hai voglia spiegarmi che differenza c'è nel passaggio per riferimento e per valore ad una funzione in C?
Non l'ho capito completamente.
GrazieProva questo programma:
#include <stdio.h>
void prova_valore (int valore)
{
printf ("%d\n", valore);
valore = 20;
}
void prova_riferimento (int *riferimento)
{
printf ("%d\n", *riferimento);
*riferimento = 20;
}
int main (void)
{
int val = 10;
prova_valore (val);
printf ("Adesso val = %d\n", val);
prova_riferimento (&val);
printf ("Adesso val = %d\n", val);
return 0;
}
La funzione prova_valore riceve il parametro int per valore. Questo vuol dire che alla funzione viene passata una copia esatta del valore e qualunque modifica tu faccia su questa copia, non altera minimamente il valore della variabile originale nel main.
La funzione prova_riferimento riceve il parametro int per riferimento (indirizzo). Nota che nel parametro c'è l'asterisco * che indica un "puntatore".
In questo caso alla funzione viene passato l'indirizzo (la locazione di memoria) dove risiede la variabile val del main. Essendo un indirizzo quello ricevuto dalla funzione, è in grado di alterare il valore della variabile originale usando l'operatore di dereferenziazione che è l'asterisco *.
L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20
Come vedi l'ultima printf stampa 20 perché la funzione prova_riferimento è stata in grado, grazie all'indirizzo, di alterare il valore.
ok sei stato molto chiaro, quindi è più pratico usare il metodo per valore..giusto?
Anche se ot mi potresti dare un consiglio sulla marca di notebook da acquistare per fare esercizi di programmazione e studio in ottica dot.net? Io vedo bene Toshiba e Dell. Tu che ne pensi?
ok sei stato molto chiaro, quindi è più pratico usare il metodo per valore..giusto?Beh ... come sempre ... dipende! Se devi passare un semplice valore (es. 1 int, double, char) e sai che la funzione non altera/non deve alterare il valore, è sufficiente il passaggio per valore.
Ci sono altri tipi di dato che non puoi passare per valore. Sono ad esempio gli array. Vengono sempre passati per riferimento (l'indirizzo del primo elemento dell'array).
Le strutture invece possono essere passate sia per valore che per riferimento. Se la struttura è piccola anche qui va bene il passaggio per valore mentre se la struttura è grande o deve essere alterato il contenuto allora si deve usare il passaggio per riferimento.
Anche se ot mi potresti dare un consiglio sulla marca di notebook da acquistare per fare esercizi di programmazione e studio in ottica dot.net? Io vedo bene Toshiba e Dell. Tu che ne pensi?Ehh ... questo non lo so. Di notebook in commercio ce ne sono una barca!! E io non sono molto esperto di notebook.
Ma di una cosa sono sicuro. Se il tuo obiettivo è quello di usare dot.net specialmente a livello di sviluppo con strumenti come ad esempio Visual C# e simili, ti conviene prendere un notebook con un processore abbastanza "prestante" (non una ciofeca ma neanche una bestia, anche per motivi di consumi/costi) e sicuramente almeno 1GB di RAM.
L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20
Non capisco i due 10 da dove li prende..
Scusami.. ma sono all'inizio..oggi facciamo i cicli for
L'output del programma è:
10
Adesso val = 10
10
Adesso val = 20
Non capisco i due 10 da dove li prende..Dalle 2 printf all'interno delle funzioni prova_valore/prova_riferimento.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.