Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como usar o setlocale neste programa?

Queria saber como usar o locale.h neste programa, uso o code blocks para compilar e palavras como "você" e "não" aparecem do seguinte modo "Você "NÃO".

Ja tentei inserir a biblioteca

#include <locale.h>

e tentei usar o comando:

setlocale(LC_ALL, "Portuguese");

de diversas formas: colocando-o em todas as funções, apenas na main e de outros jeitos não funcionou. Como posso proceder?

4 respostas
solução!

Olá Vinicius.

Poderia tentar utilizar o comando omitindo a linguagem e deixar para ele pegar a padrão do Sistema Operacional.

setLocale(LC_ALL,"");

Se isso não solucionar poderia me dizer qual Sistema Operacional está utilizando e colocar aqui o seu código para eu poder entender melhor.

Fico no aguardo, Bons estudos.

Estou usando o Windows 10 Pro. Em relação ao código, minha maior dúvida é onde usar o comando, se é na função em que contém as palavras com acentuação, na int main, ou em ambas.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "forca.h"
#include <locale.h>
#define TAMANHO_PALAVRA 20

char palavrasecreta[TAMANHO_PALAVRA];
char chutes[26];
int chutesdados = 0;

int letraexiste(char letra) {
    for(int j = 0; j < strlen(palavrasecreta); j++) {
        if(letra == palavrasecreta[j]) {
            return 1;
        }
    }
    return 0;
}

int chuteserrados() {
    int erros = 0;

    for(int i = 0; i < chutesdados; i++) {
        if(!letraexiste(chutes[i])) {
            erros++;
        }
    }
    return erros;
}

int enforcou() {
    return chuteserrados() >= 5;
}

int ganhou() {
    for(int i = 0; i < strlen(palavrasecreta); i++) {
        if(!jachutou(palavrasecreta[i])) {
            return 0;
        }
    }
    return 1;
}

void abertura() {
    printf("/****************/\n");
    printf("/ Jogo de Forca */\n");
    printf("/****************/\n\n");
}

void chuta() {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    if(letraexiste(chute)) {
        printf("Você acertou: a palavra tem a letra %c\n\n", chute);
    } else {
        printf("\nVocê errou: a palavra NÃO tem a letra %c\n\n", chute);
    }

    chutes[chutesdados] = chute;
    chutesdados++;
}

int jachutou(char letra) {
    int achou = 0;
    for(int j = 0; j < chutesdados; j++) {
        if(chutes[j] == letra) {
            achou = 1;
            break;
        }
    }
    return achou;
}

void desenhaforca() {

    int erros = chuteserrados();

    printf("  _______       \n");
    printf(" |/      |      \n");
    printf(" |      %c%c%c  \n", (erros>=1?'(':' '), (erros>=1?'_':' '), (erros>=1?')':' '));
    printf(" |      %c%c%c  \n", (erros>=2?'\\':' '), (erros>=2?'|':' '), (erros>=2?'/': ' '));
    printf(" |       %c     \n", (erros>=3?'|':' '));
    printf(" |      %c %c   \n", (erros>=4?'/':' '), (erros>=4?'\\':' '));
    printf(" |              \n");
    printf("_|___           \n");
    printf("\n\n");

    for(int i = 0; i < strlen(palavrasecreta); i++) {

        if(jachutou(palavrasecreta[i])) {
            printf("%c ", palavrasecreta[i]);
        } else {
            printf("_ ");
        }

    }
    printf("\n");
}

void escolhepalavra() {
    FILE* f;

    f = fopen("palavras.txt", "r");
    if(f == 0) {
        printf("Banco de dados de palavras não disponível\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for(int i = 0; i <= randomico; i++) {
        fscanf(f, "%s", palavrasecreta);
    }
    fclose(f);
}


void adicionapalavra() {
    char quer;

    printf("Você deseja adicionar uma nova palavra no jogo (S/N)?");
    scanf(" %c", &quer);

    if(quer == 'S') {
        char novapalavra[TAMANHO_PALAVRA];

        printf("Digite a nova palavra, em letras maiúsculas: ");
        scanf("%s", novapalavra);

        FILE* f;

        f = fopen("palavras.txt", "r+");
        if(f == 0) {
            printf("Banco de dados de palavras não disponível\n\n");
            exit(1);
        }

        int qtd;
        fscanf(f, "%d", &qtd);
        qtd++;
        fseek(f, 0, SEEK_SET);
        fprintf(f, "%d", qtd);

        fseek(f, 0, SEEK_END);
        fprintf(f, "\n%s", novapalavra);

        fclose(f);
    }
}

int main() {

    setlocale(LC_ALL,"");
    abertura();
    escolhepalavra();

    do {
        desenhaforca();
        chuta();

    } while (!ganhou() && !enforcou());

    if(ganhou()) {
        printf("\nParabéns, você ganhou!\n\n");

        printf("       ___________      \n");
        printf("      '._==_==_=_.'     \n");
        printf("      .-\\:      /-.    \n");
        printf("     | (|:.     |) |    \n");
        printf("      '-|:.     |-'     \n");
        printf("        \\::.    /      \n");
        printf("         '::. .'        \n");
        printf("           ) (          \n");
        printf("         _.' '._        \n");
        printf("        '-------'       \n\n");

    } else {
        printf("\nPuxa, você foi enforcado!\n");
        printf("A palavra era **%s**\n\n", palavrasecreta);
        printf(" _                     ");
        printf("| |                    ");
        printf("| | ___  ___  ___ _ __ ");
        printf("| |/ _ \/ __|/ _ \ '__|");
        printf("| | (_) \__ \  __/ |   ");
        printf("|_|\___/|___/\___|_|   ");
    }
    adicionapalavra();
}

Olá Vinicius.

Eu copiei o seu código no CodeBlocks que tenho no meu Win10 e ele funcionou normalmente.

Enquanto eu busco alguma maneira de reproduzir a sua situação na minha maquina, você poderia por favor criar um novo arquivo e colar seu código nele para ver se o erro se mantem ?

E quando a duvida de onde colocar, você está correto em colocar logo no inicio dentro do main, porque a partir daquele ponto o programa vai entender que deve utilizar os caracteres do idioma português.

Bons estudos, fico no aguardo de saber se a solução resolveu e enquanto isso vou buscar alguma alternativa.

Olá Igor,

Muito obrigado, fiz o arquivo novo e o erro foi resolvido!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software