0
votes

Lorsque j'entraîne un numéro en caractères de caractère, pourquoi je ne peux pas obtenir un nombre entier?

Je saisi un numéro dans la variable de type de caractère. Comme 12 ou 22. Mais, la console me montre un 1 ou 2. Comment puis-je obtenir un nombre entier 12, 22 dans la console? XXX PRE>

Voici le résultat de la console. P>

#include <iostream>

using namespace std;

int index = 0;
constexpr int pagenum = 10;

void chapterlist(void);

void nextlist(void);

void beforelist(void);

void movechapter(char a);


int main(void)
{   
    char userin = 0;
    bool toggle = 0;
    
    cout << "결과를 볼 챕터를 고르시오." << endl;
    
    chapterlist();

    cout << "다음 페이지로 이동: n" << endl;
    
    cin >> userin;

    if (userin == 'n')
    {
    backflash:

        while(toggle == 0)
        {
            nextlist();
            cin >> userin;

            if (userin == 'b')
            {
                toggle = 1;
                goto backflash;
            }
            else if (userin == 'n')
                continue;
            else
            {
                system("cls");
                movechapter(userin);
                break;
            }
        }

        while(toggle == 1)
        {
            beforelist();
            cin >> userin;

            if (userin == 'n')
            {
                toggle = 0;
                goto backflash;
            }
            else if (userin == 'b')
                continue;
            else
            {
                system("cls");
                movechapter(userin);
                break;
            }
        }
    }
    else
    {
        system("cls");
        movechapter(userin);
    }
    
    return 0;
}

void chapterlist(void)
{
    int x = 0;

    for (x = index + 1; x <= index + 10; x++)
        cout << "Chapter." << x << endl;
}

void nextlist(void)
{
    system("cls");

    cout << "결과를 볼 챕터를 고르시오." << endl;

    index = index + pagenum;
    chapterlist();

    cout << "다음 페이지로 이동: n" << endl;
    cout << "이전 페이지로 이동: b" << endl;
}

void beforelist(void)
{
    system("cls");

    cout << "결과를 볼 챕터를 고르시오." << endl;

    index = index - pagenum;
    chapterlist();

    cout << "다음 페이지로 이동: n" << endl;
    cout << "이전 페이지로 이동: b" << endl;
}

void movechapter(char a)
{
    cout << "선택한 Chapter." << a << "의 결과입니다." << endl;
}


8 commentaires

Parce que '1' est un caractère et est donc '2' dans la chaîne "12" . Vous lisez «caractères», toute conversion (par exemple sur int ) après lecture des caractères.


Umm je dois prendre la décision ce que je veux demander. si compliqué même que je vois.


Ça s'empire. ASCII était le jeu de caractères de base, mais très limité. Ainsi, UTF-8, Unicode et UTF-16 sont venus. (caractères multi-octets). C et C ++ fournissent à la fois des routines d'entrée de base permettant de lire les différents types de caractères et numériques qui gèrent la conversion du type de caractères numérique pour vous. Les types de caractères larges nécessitent une manipulation spéciale sur l'entrée (bien que UTF-8 soit généralement traitée automatiquement avec les routines de sortie de base)


Ce serait formidable si vous commenciez à ce que cette lettre coréenne signifie, afin que nous puissions avoir une meilleure compréhension de votre code


Je ne sais pas si je comprends votre code correctement, vous souhaitez que l'utilisateur entrait n ou b pour passer à la page suivante ou précédente, et entrez un numéro pour aller à la Numéro de chapitre correspondant?


Je comprends David. Je dois trouver une autre façon d'entrer.


Vous avez exactement raison. Ranoiarep. et cout << "chapitre." << un << "의 결과 입니다." << endl; signifie "C'est le résultat du chapitre.'a" Vous avez sélectionné ".


En fait, je dois ajouter plus de code pour faire un programme que je veux. Mais sur le chemin, je trouve une erreur.


3 Réponses :


3
votes

Tout d'abord, vous devez comprendre quel type Char code> est.

Types de caractères: ils peuvent représenter un seul caractère, tel que «A» ou «$». Le type le plus basique est char code>, qui est un caractère d'une octet. D'autres types sont également fournis pour des caractères plus larges. P> blockQuote>

Pour simplifier que, char code> ne peut contenir qu'un seul caractère. p>

où comme avec votre code, "12" est en réalité 2 caractères distincts, "1 ' et '2', et c'est la raison pour laquelle cela ne fonctionnerait pas. p>

au lieu de déclarer A code> en tant que type char code>, vous pouvez le déclarer en tant que int code> type, qui est un type conçu pour contenir des chiffres. Donc, vous auriez: p> xxx pré>

Cependant, notez que int code> a souvent une valeur maximale de 2 ^ 31. P>

Ou vous pouvez utiliser std :: chaîne code> pour stocker des chaînes de caractères. Toutefois, notez que si vous souhaitez effectuer des calculs à votre type CODE> String CODE>, vous devez les convertir en un type de numéro: P>

if(std::all_of(userin .begin(), userin.end(), ::isdigit))


4 commentaires

Donc, si je veux obtenir '12', dois-je utiliser un tableau de charcuterie?


Oui, vous pouvez utiliser un tableau de caractères. C'est ce que les "chaînes" sont en C: une gamme de caractères de terminaison nulle. Mais si vous utilisez C ++, un meilleur choix serait d'utiliser std :: string < / a>. Si vous préférez avoir une valeur, vous pouvez faire de l'arithmétique avec, vous pourriez plutôt utiliser un Type d'entier , comme "INT".


@ 유장현 dépend de votre objectif pour le code. Si vous savez que l'utilisateur entrait uniquement un numéro, vous utiliseriez un type de numéro, comme int ou long


@Ranoiarep ok j'essaie d'utiliser std :: String. Merci de répondre à ma question!



0
votes

Bien que Char code> est juste un nombre, il est présumé pour signifier "caractère unique" ici pour l'entrée. Fixez ceci en demandant quelque chose d'autre:

int a = 0;


3 commentaires

La raison pour laquelle j'utilise car, c'est que je veux obtenir deux types d'informations. comme 12 et 'r'. Donc, je veux les obtenir en même temps dans la console.


Vous pouvez avoir deux types de variable différents, tels que int x et char y puis std :: cin >> x >> y qui va gérer chaque type individuellement.


Merci à votre commentaire! Eh bien, cette façon semble bien de faciliter le programme. Je vais essayer alors!



0
votes

Vous devez lire des caractères dans une chaîne, puis convertir cette chaîne en int. Il serait probablement plus logique d'utiliser quelque chose comme getline () code> pour lire l'entrée, plutôt que CIN >> A code>.

#include <string>
#include <iostream>
#include <stdexcept>
#include <stdio.h>

int main() {
    std::string input_string;
    /* note that there is no function that will convert an int string
       to a char, only to an int. You can cast this to a char if needed,
       or bounds check like I do */
    int value;

    while(1) {
        getline(std::cin, input_string);
        /* std::stoi throws std::invalid_argument when given a string
           that doesn't start with a number */
        try {
            value = std::stoi(input_string);
        } catch (std::invalid_argument) {
            printf("Invalid number!\n");
            continue;
        }
        /* You wanted a char, the max value of a `char` is 255. If 
           you are happy for any value, this check can be removed */
        if (value > 255) {
            printf("Too big, input a number between 0-255\n");
            continue;
        }
        break;
    }
    printf("Number is %hhu\n", value);
}


2 commentaires

Quelque chose de difficile pour moi ... mais je comprends ce que tu veux me dire. Merci!


Vous n'auriez pas besoin d'écrire les spécificateurs de type, plutôt d'utiliser std :: cout pour imprimer à la place (le code est de C ++).