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.