ääkkösten käsittely

Koodaan ohjelmaa jonka tulisi osata muuttaa kirjaimet pieniksi. Yritän käyttää seuraavaa funktiota:

char pieneksi( char c )
{
switch ( c ) {
case 'å':
case 'Å':
return 'å';
case 'ä':
case 'Ä':
return 'ä';
case 'ö':
case 'Ö':
return 'ö';
default:
return tolower( c );
}
}

saan g :lta seuraavanlaisia varoituksia:

warning: multi-character character constant
warning: overflow in implicit constant conversion

mikä vikana?
10887
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat

tolower-funktio ottaa parametriksi int-tyypin ja palauttaa sellaisen. Tee omasta funktiostasi samanlainen.

Äänestä
  • tolower toimii kyllä näinkin, vain noissa erityistapauksissa (äåö) tulee warningia

    Äänestä

Epäilen että käytät editoria jonka asetuksissa määritetty että se tuottaa utf-8 koodia jossa yli 7-bittiset ASCII merkit esitetään useammlla tavulla. Switchin parametrina on kuitenkin char joten ristiriita on valmis.

Vaihda koodaukseksi ISO-8859-1 niin varoitukset katoavat.

Äänestä

Eihöhän onnistu makrolla helpommin (ja nopeammin) näin:

#define TO_LOWER(c) c|0x20

(Voit tietysti muuttaa sen funktioksi.)

Äänestä
  • Tuohan on juuri mitä tolower() tekee paitsi että se myös tarkistaa onko annettu parametri 7-bittisen ASCII:n kirjain. Siis EI toimi öökkösillä.

    Äänestä

  • hyvä! kirjoitti:

    Tuohan on juuri mitä tolower() tekee paitsi että se myös tarkistaa onko annettu parametri 7-bittisen ASCII:n kirjain. Siis EI toimi öökkösillä.

    Onkelmahan on tietysti ettei toi makro tarkista mitään, vaan muuttaa esim. merkin '[' merkiksi '{' jne., mikä tuskin on toivottavaan. Eli pitäisi ensin tarkistaa että merkki on kirjain. Ja kun katsotaan ISO 8859-15 merkistöä
    http://fi.wikipedia.org/wiki/ISO_8859-15 niin joku tommoinen (ehkä) toimii. (muuttaa myös ei skandeja):

    char to_lower(char c)
    {
       if ( c == '×') // välissä ei kirjain
          return c;
       if ((('A' >= c)&&(c = c)&&(c

    Äänestä

  • ---ööööö--- kirjoitti:

    Onkelmahan on tietysti ettei toi makro tarkista mitään, vaan muuttaa esim. merkin '[' merkiksi '{' jne., mikä tuskin on toivottavaan. Eli pitäisi ensin tarkistaa että merkki on kirjain. Ja kun katsotaan ISO 8859-15 merkistöä
    http://fi.wikipedia.org/wiki/ISO_8859-15 niin joku tommoinen (ehkä) toimii. (muuttaa myös ei skandeja):

    char to_lower(char c)
    {
       if ( c == '×') // välissä ei kirjain
          return c;
       if ((('A' >= c)&&(c = c)&&(c

    Ongelma on Microsoftin käyttämät epämääräiset Extended-ASCII merkistöt joissa scandit on missä sattuu.

    Esim Windowsilla 'Å'=10001111, 'å'=10000110, 'Ä'=10001110 ja 'ä'=10000100 joten case-muunnos ei onnistu 1 bitin maskauksella ja eikä useammallakaan bitillä muuten kuin tapauskohtaisesti.

    Äänestä

  • ongelma. kirjoitti:

    Ongelma on Microsoftin käyttämät epämääräiset Extended-ASCII merkistöt joissa scandit on missä sattuu.

    Esim Windowsilla 'Å'=10001111, 'å'=10000110, 'Ä'=10001110 ja 'ä'=10000100 joten case-muunnos ei onnistu 1 bitin maskauksella ja eikä useammallakaan bitillä muuten kuin tapauskohtaisesti.

    - Microsoftilla ei ole tekemistä asian kanssa.

    http://www.personal-computer-tutor.com/extended.htm


    Eivätkä ne ole 'epämääräisiä muutoihn kuin, että amerikkalaisille ei ollut muuta maailmaa.

    Äänestä

  • on IBM'n peruja kirjoitti:

    - Microsoftilla ei ole tekemistä asian kanssa.

    http://www.personal-computer-tutor.com/extended.htm


    Eivätkä ne ole 'epämääräisiä muutoihn kuin, että amerikkalaisille ei ollut muuta maailmaa.

    >Eivätkä ne ole 'epämääräisiä ...

    Eivät vai? Miksi DOS:in ja Windowsin extended koodit ovat TÄYSIN erilaisia? :)

    http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ext-pc.htm

    Ja Macissa vielä erilaisempia:

    http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ext-mac.htm

    Äänestä


Kommentoi aloitusta


heheheheehee hee kirjoitti:

Koodaan ohjelmaa jonka tulisi osata muuttaa kirjaimet pieniksi. Yritän käyttää seuraavaa funktiota:

char pieneksi( char c )
{
switch ( c ) {
case 'å':
case 'Å':
return 'å';
case 'ä':
case 'Ä':
return 'ä';
case 'ö':
case 'Ö':
return 'ö';
default:
return tolower( c );
}
}

saan g :lta seuraavanlaisia varoituksia:

warning: multi-character character constant
warning: overflow in implicit constant conversion

mikä vikana?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu