Hei,
Yritän lukea terminaalista merkkejä, jotka ovat utf-8 muodossa, tarvitsisin sitten pystyä vertaamaan niitä keskenään, merkki kerralaan, jotta voin tarkistaa onko annettu syöte palindromi.
Olen ymmärtänyt, että char32_t tyyppiä voinee käyttää? char antaisi vain 8 bittisiä merkkejä utf-8:n useampi bittisten merkkejen sijaan.
Koodi tällä hetkellä on, mutta valitettavasti se ei toimi. strlen ja scanf ei tue char32_t ?
char32_t input[150];
printf("This is a palindrome checker, type a text and press RET\n");
scanf("%s", input);
int i;
int j = strlen(input) - 1;
for(i=0; i<j; i++, --j){
if(input[i]!=input[j]){
printf("It is not a palindrome\n");
return (0);
}
}
printf("It is a palindrome\n");
return (0);Yksi vaihtoehto on käyttää wchar_t-tyyppiä. Sen käyttö edellyttää, että oikea merkistö (UTF-8) on saatu käyttöön setlocale-funktiolla. Linuxissa sopivat parametrit setlocale-funktiolle löytyvät yleensä ympäristömuuttujista. Windowsista en osaa suoralta kädeltä sanoa, mutta siellähän UTF-8-tuki on ylipäänsä epämääräisempi.
// gcc -Wall -pedantic -std=c11
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
int main(void) {
// Asetetaan käyttäjän ympäristömuuttujien mukainen LC_CTYPE.
setlocale(LC_CTYPE, getenv("LANG"));
setlocale(LC_CTYPE, getenv("LC_CTYPE"));
setlocale(LC_CTYPE, getenv("LC_ALL"));
// Luetaan enintään 15:n koodipisteen sana.
wchar_t sana[2][16];
scanf("%15ls", sana[0]);
// Käännetään sana.
int len = wcslen(sana[0]);
for (int i = 0; (sana[1][len-i-1] = sana[0][i]) != 0; ++i);
printf("sana: %ls, pituus: %d, käännettynä: %ls\n", sana[0], len, sana[1]);
}Usein on kylläkin käytännöllistä säilyttää UTF-8-muotoinen teksti tavallisessa char-taulukossa ja käyttää erillisiä algoritmeja niihin harvoihin tapauksiin, joissa sitä tarvitsee oikeasti käsitellä koodipiste kerrallaan.
char32_t ei kuulu C:hen vaan C++:aan.
Kiitos vinkeistä! Sain toimimaan tuon wchar_t tyypin kanssa haluamallani tavalla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.