C-keele char ja int tüüpide konverteerimine: praktilised näited ja ohud

1. Andmetüüpide olulisus C-keeles

C-keeles mõjutavad andmetüübid oluliselt programmi täpsust ja jõudlust. char-tüüpi ja int-tüüpi kasutatakse sageli põhiliste andmetüüpidena ning sageli tekib vajadus nende omavaheliseks teisendamiseks. Selles artiklis selgitatakse, kuidas teisendada char-tüüpi ja int-tüüpi ning millistele punktidele tuleks tähelepanu pöörata.

Teisenduse üldised kasutusviisid

Programmeerimisel on char– ja int-tüüpide omavaheline teisendamine kasulik näiteks juhul, kui soovitakse käsitleda tähemärke ning nendele vastavaid numbrilisi väärtusi või säästa mälumahtu. Näiteks saab char-tüübist saadud ASCII-koodi teisendada int-tüüpi ja kasutada arvutustes. Samuti on vaja teisendamist siis, kui char-tüüpi sisestatud väärtust soovitakse töödelda arvuna.

2. char-tüübi teisendamine int-tüübiks

C-keeles tehakse char-tüübi teisendamine int-tüübiks tüübikastingu abil. Nii saab char-tüüpi väärtusi käsitleda täisarvudena.

Põhiline teisendusviis

char-tüüpi väärtuse int-tüübiks teisendamiseks kasutatakse lihtsat tüübi konverteerimist (cast).

#include <stdio.h>

int main() {
    char character = 'A';  // 'A' ASCII-kood on 65
    int intValue = (int)character;  // char -> int cast
    printf("Tähemärgi %c ASCII-kood on %d.\n", character, intValue);
    return 0;
}

Selles programmis teisendatakse tähemärk 'A' täisarvuks ning tulemus prinditakse välja – tulemuseks on 65.

Märgiga ja märkideta char-tüüp

C-keeles on olemas nii märgiga (signed char) kui märkideta (unsigned char) char-tüüp. Märgiga char võib olla negatiivne, märkideta char väärtused on 0 kuni 255. char-tüüpi int-tüübiks teisendamisel tuleb sellele erinevusele tähelepanu pöörata. Näiteid mõlemast teisendusest:

#include <stdio.h>

int main() {
    unsigned char uChar = 200;  // märkideta char
    int intValue = (int)uChar;
    printf("Märkideta char väärtus %u teisendatuna int-tüübiks on %d.\n", uChar, intValue);
    return 0;
}

Selles näites teisendatakse märkideta char väärtus 200 int-tüübiks ning tulemus jääb samuti 200. Märgiga puhul võib tulemus sõltuvalt väärtusest muutuda, seega tuleb alati olla teadlik tüüpide erinevustest.

侍エンジニア塾

3. int-tüübi teisendamine char-tüübiks

int-tüübist char-tüübiks teisendamine tähendab, et suurem arvutüüp teisendatakse väiksemaks. Kui int-tüüpi väärtus ületab char-tüübi vahemiku, võib osa andmetest kaotsi minna, mistõttu tuleb olla ettevaatlik.

Teisendusviisid ja ettevaatusabinõud

Kui int-tüüpi väärtus teisendatakse char-tüübiks, võivad vahemikust väljaspool olevad väärtused anda ootamatuid tulemusi.

#include <stdio.h>

int main() {
    int number = 300;  // väärtus väljaspool char vahemikku
    char character = (char)number;  // andmekadu
    printf("Täisarvu %d teisendamine char-tüübiks annab märgi '%c'.\n", number, character);
    return 0;
}

Selles programmis teisendatakse 300 char-tüübiks ning tulemuseks võib olla ootamatu sümbol. Seetõttu tuleb alati arvestada char-tüübi vahemikuga.

4. Stringi teisendamine arvuks

C-keeles on sagedane vajadus teisendada string (tekst) täisarvuks, näiteks kasutaja sisendi töötlemisel. Selleks sobivad hästi funktsioonid atoi ja strtol.

Teisendamine atoi funktsiooniga

atoi-funktsiooniga saab stringi hõlpsalt teisendada täisarvuks, kuid sellel meetodil on piiratud veakontroll.

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "1234";
    int number = atoi(str);  // string -> int
    printf("Stringi %s teisendamine täisarvuks annab %d.\n", str, number);
    return 0;
}

Selles programmis teisendatakse string "1234" täisarvuks 1234, kuid võimalike vigade korral ei anta teada.

Turvaline teisendamine strtol-funktsiooniga

strtol-funktsioon võimaldab teisendada stringi täisarvuks koos vigade kontrolliga, mis muudab kasutamise turvalisemaks.

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "1234";
    char *endptr;
    long int number = strtol(str, &endptr, 10);  // ohutu teisendamine
    if (*endptr != '\0') {
        printf("Teisendamine ebaõnnestus.\n");
    } else {
        printf("Stringi %s teisendamine täisarvuks annab %ld.\n", str, number);
    }
    return 0;
}

Selles koodis kuvatakse veateade juhul, kui teisendamine ebaõnnestub. Nii saab stringi turvaliselt arvuks teisendada.

5. char- ja int-tüüpide praktilised kasutusnäited

Lõpetuseks vaatame, kuidas char– ja int-tüüpe saab koos rakendada praktilistes olukordades.

Segaarvutused char- ja int-tüübiga

Järgmine programm demonstreerib, kuidas char– ja int-tüüpe saab koos kasutada – tähemärgi ja arvu abil luuakse uus märk.

#include <stdio.h>

int main() {
    char ch = 'a';
    int num = 3;
    char result = ch + num;  // 'a' ASCII väärtusele lisatakse 3
    printf("Tähemärgile %c liidetud %d annab tähemärgi '%c'.\n", ch, num, result);
    return 0;
}

Selles programmis liidetakse 'a' ASCII-koodile 3 ning tulemuseks on 'd'. See näitab, kui lihtsalt saab char– ja int-tüüpe koos kasutada.

侍エンジニア塾