|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
[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!! ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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: Codice:
#include <stdio.h> int main (void) { printf ("à\n"); return 0; } Ecco l'output (io ho creato un prova.exe): ![]() 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: Codice:
#include <stdio.h> int main (void) { printf ("\x85\n"); return 0; } Di set di caratteri ce ne sono davvero tanti (troppi ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
Grazie mille per la pazienza.. quindi è un discorso di seti di caratteri..
Asci centra qualcosa o sono fuori strada? |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
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.. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
Ti ripeto il grazie per la pazienza..
OK ho combinato, prima ero stato disattento.. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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. ![]() 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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
mi dice 850
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque ho verificato le mappe della 437 e 850: le 10 lettere accentate sono nello stesso posto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
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? |
![]() |
![]() |
![]() |
#12 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() 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: Codice:
public class Prova { public static void main (String[] args) { System.out.println ("àèìòù áéíóú"); } } ÓÞý‗¨ ßÚݾ· Se invece provi questo programma Java: Codice:
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); } } ![]() e come vedi i caratteri sono ok. Quote:
Ma questa è una mia opinione personale. Altri potrebbero dirti che per iniziare a programmare bisogna partire da Java o da altro ancora. Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
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 |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#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_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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
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? |
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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. Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Nov 2004
Messaggi: 235
|
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 |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:51.