Ir ao conteúdo

Posts recomendados

Postado

Tenho a seguinte implementação

void receberInputUsuario(char palavra[], int tamanho) {
    setbuf(stdin, NULL);
    int i = 0;
    char c;
    c = getchar();
    while ((c != '\n') && (i < tamanho)) {
        palavra[i++] = c;
        c = getchar();
    }
    palavra[i] = '\0';
    if (c != '\n') {
        c = getchar();
        while ((c != '\n') && (c != EOF)) {
            c = getchar();
        }
    }
    while ((i) < 1) {
        printf("O campo não pode ficar vazio!\n");
        printf("Forneca ao menos um valor: ");
        receberInputUsuario(palavra, tamanho);
    }
}

void tratarString(char palavra[]) {
	unsigned int i, k, x = 0;

	char comAcentos[] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";
	char semAcentos[] = "AAAAAAaaaaaEEEEeeeeIIIIiiiiOOOOOoooooUUUuuuuCc";

	//Removendo acentos
	for (k = 0; k < strlen(palavra); k++) {
		for (i = 0; i < strlen(comAcentos); i++) {
			if (palavra[k] == comAcentos[i]) {
				palavra[k] = semAcentos[i];
			}
		}
	}

	//Transformando em maiúsculo
	while (palavra[x]) {
		palavra[x] = toupper(palavra[x]);
		x++;
	}
}




int main(void) {
    char entrada[100];// = "çaça caçador na çaçada contra ãma ópí";

    receberInputUsuario(entrada,100);

    tratarString(entrada);

    printf("%s",entrada);
    return 0;
}

 

eu testei a função como no exemplo que está comentado, mas quando eu faço um fgets para receber o input do usuario da erro nas letras acentuadas.

como posso estar corrigindo esse erro?

  • Curtir 1
Postado
12 minutos atrás, HUGO_dev_ze disse:

eu testei a função como no exemplo que está comentado, mas quando eu faço um fgets para receber o input do usuario da erro nas letras acentuadas.

como posso estar corrigindo esse erro?

Que erro é esse? Onde entra fgets() nesse cenário? Sua função usa getchar(). 

Se usa Windows precisa definir a página de código da console para uma que tenha de fato esses símbolos. A página padrão do Windows 10 não tem...

  • Curtir 1
Postado
7 minutos atrás, arfneto disse:

Que erro é esse? Onde entra fgets() nesse cenário? Sua função usa getchar(). 

 

Pois é. Que erro é esse? 

Entendeu o que eu expliquei sobre a pagina de codigo? Está usando Windows? Está rodando o programa numa console ou no terminal? Ou só no IDE como todo mundo? 

  • Curtir 1
Postado
3 horas atrás, arfneto disse:

 

Pois é. Que erro é esse? 

Entendeu o que eu expliquei sobre a pagina de codigo? Está usando Windows? Está rodando o programa numa console ou no terminal? Ou só no IDE como todo mundo? 

Eu rodando o programa no windows.

Estou usando code:bloks que tem como copilar c/c++

 

fgets(); eu esou tentando fazer com que recebe caractere do tipo "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç", mas não estar reconhecendo, a função tratarString, esta reconhecendo so "AAAAAAaaaaaEEEEeeeeIIIIiiiiOOOOOoooooUUUuuuuCc",

 

minha função de tratar strings é para pegar uma frase por exemplo: "caçador",

e trasformar em "CACADOR"

Tirando os acentos ao ínvez disso ele deixa assim: "CAçADOR"

 

eu queria saber como posso corrigir esse erro, pois quando faço :

char entrada[100] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";

da certo e a saida fica como:

AAAAAAAAAAAEEEEEEEEIIIIIIIIOOOOOOOOOOUUUUUUUCC

 

que é o que eu esperava de fgets

 

teria outra forma de eu receber a  string do usuario para ele reconhecer acentos?

 

 

 

  • Obrigado 1
Postado
13 minutos atrás, HUGO_dev_ze disse:

Pois é. Que erro é esse? 

Entendeu o que eu expliquei sobre a pagina de codigo? Está usando Windows? Está rodando o programa numa console ou no terminal? Ou só no IDE como todo mundo? 

 

Pergunto de novo:

  • entendeu o que eu expliquei sobre a página de código? Qual está usando?
  •   Está rodando o programa numa console ou no terminal?

Qual o locale de seu computador? Porque não chamou setlocale() dentro do código?

 

15 minutos atrás, HUGO_dev_ze disse:

eu queria saber como posso corrigir esse erro, pois quando faço :

char entrada[100] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";

da certo e a saida fica como:

AAAAAAAAAAAEEEEEEEEIIIIIIIIOOOOOOOOOOUUUUUUUCC

 

que é o que eu esperava de fgets

 

teria outra forma de eu receber a  string do usuario para ele reconhecer acentos?

 

Você quer reconhecer ou extrair as letras acentuadas?

 

  • Curtir 1
Postado

gostaria de fazer assim:

1- o usuario digitasse algo tipo "caçador";

2- função de tratar string pegar e substituiu "caçador" por "cacador";

3-mostrar com a função toupper(), algo do tipo "CACADOR"

  • Curtir 1
Postado

@HUGO_dev_ze imagino que não vá de fato responder às coisas que perguntei.

 

Mas ao menos explicou o que quer fazer.

6 minutos atrás, arfneto disse:
    char entrada[] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";

 

 

Não escreva assim. Faça o simples

 

char entrada[] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";

 

O compilador sabe contar as letrinhas.

  • Curtir 1
Postado
3 horas atrás, arfneto disse:

@HUGO_dev_ze imagino que não vá de fato responder às coisas que perguntei.

 

Mas ao menos explicou o que quer fazer.

 

Não escreva assim. Faça o simples

 

char entrada[] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";

 

O compilador sabe contar as letrinhas.

eu estou usando a ide code bloks, ele e via terminal 

quando eu uso locale também não da certo

 

 

ok , gostaria que o copilador recebece do usuario as letras 

  • Curtir 1
Postado
4 minutos atrás, HUGO_dev_ze disse:

eu estou usando a ide code bloks, ele e via terminal 

quando eu uso locale também não da certo

 

 

Desisto. Imagino que esteja rodando seu programa unicamente dentro desse IDE Code::Blocks e que não vá mesmo responder nada sobre a página de código e sobre locale ou sobre a diferença em rodar seu programa fora do IDE em uma console ou no Terminal do Windows. E faz muita diferença.

E nada vai dizer sobre a página de código também, porque já perguntei 3x :(

 

Esse complicado programa de 10 linhas 

 

#include <stdio.h>
#include <string.h>
int main(void)
{
    unsigned char entrada[] = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";
    unsigned tam = strlen((const char*)entrada);
    printf("Entrada com %u simbolos:\n", tam);
    for (unsigned i=0;i<tam;i+=1)
        printf("original: '%c' = hex [%X], valor:[%d]\n",
         entrada[i], entrada[i], entrada[i]);
    return 0;
} 

 

mostra numa console

 

Entrada com 46 simbolos:
original: '─' = hex [C4], valor:[196]
original: '┼' = hex [C5], valor:[197]
original: '┴' = hex [C1], valor:[193]
original: '┬' = hex [C2], valor:[194]
original: '└' = hex [C0], valor:[192]
original: '├' = hex [C3], valor:[195]
original: 'õ' = hex [E4], valor:[228]
original: 'ß' = hex [E1], valor:[225]
original: 'Ô' = hex [E2], valor:[226]
original: 'Ó' = hex [E0], valor:[224]
original: 'Ò' = hex [E3], valor:[227]
original: '╔' = hex [C9], valor:[201]
original: '╩' = hex [CA], valor:[202]
original: '╦' = hex [CB], valor:[203]
original: '╚' = hex [C8], valor:[200]
original: 'Ú' = hex [E9], valor:[233]
original: 'Û' = hex [EA], valor:[234]
original: 'Ù' = hex [EB], valor:[235]
original: 'Þ' = hex [E8], valor:[232]
original: '═' = hex [CD], valor:[205]
original: '╬' = hex [CE], valor:[206]
original: '¤' = hex [CF], valor:[207]
original: '╠' = hex [CC], valor:[204]
original: 'Ý' = hex [ED], valor:[237]
original: '¯' = hex [EE], valor:[238]
original: '´' = hex [EF], valor:[239]
original: 'ý' = hex [EC], valor:[236]
original: 'Í' = hex [D6], valor:[214]
original: 'Ë' = hex [D3], valor:[211]
original: 'È' = hex [D4], valor:[212]
original: 'Ê' = hex [D2], valor:[210]
original: 'ı' = hex [D5], valor:[213]
original: '÷' = hex [F6], valor:[246]
original: '¾' = hex [F3], valor:[243]
original: '¶' = hex [F4], valor:[244]
original: '‗' = hex [F2], valor:[242]
original: '§' = hex [F5], valor:[245]
original: '▄' = hex [DC], valor:[220]
original: '┌' = hex [DA], valor:[218]
original: '█' = hex [DB], valor:[219]
original: '³' = hex [FC], valor:[252]
original: '·' = hex [FA], valor:[250]
original: '¹' = hex [FB], valor:[251]
original: '¨' = hex [F9], valor:[249]
original: 'Ã' = hex [C7], valor:[199]
original: 'þ' = hex [E7], valor:[231]

 

Mas pode mostrar no Terminal

 

PS C:\src\temp> ./af3-1117
Entrada com 46 simbolos:
original: 'Ä' = hex [C4], valor:[196]
original: 'Å' = hex [C5], valor:[197]
original: 'Á' = hex [C1], valor:[193]
original: 'Â' = hex [C2], valor:[194]
original: 'À' = hex [C0], valor:[192]
original: 'Ã' = hex [C3], valor:[195]
original: 'ä' = hex [E4], valor:[228]
original: 'á' = hex [E1], valor:[225]
original: 'â' = hex [E2], valor:[226]
original: 'à' = hex [E0], valor:[224]
original: 'ã' = hex [E3], valor:[227]
original: 'É' = hex [C9], valor:[201]
original: 'Ê' = hex [CA], valor:[202]
original: 'Ë' = hex [CB], valor:[203]
original: 'È' = hex [C8], valor:[200]
original: 'é' = hex [E9], valor:[233]
original: 'ê' = hex [EA], valor:[234]
original: 'è' = hex [E8], valor:[232]
original: 'Î' = hex [CE], valor:[206]
original: 'Ï' = hex [CF], valor:[207]
original: 'Ì' = hex [CC], valor:[204]
original: 'í' = hex [ED], valor:[237]
original: 'î' = hex [EE], valor:[238]
original: 'ï' = hex [EF], valor:[239]
original: 'ì' = hex [EC], valor:[236]
original: 'Ö' = hex [D6], valor:[214]
original: 'Ó' = hex [D3], valor:[211]
original: 'Ô' = hex [D4], valor:[212]
original: 'Ò' = hex [D2], valor:[210]
original: 'Õ' = hex [D5], valor:[213]
original: 'ö' = hex [F6], valor:[246]
original: 'ó' = hex [F3], valor:[243]
original: 'ô' = hex [F4], valor:[244]
original: 'ò' = hex [F2], valor:[242]
original: 'õ' = hex [F5], valor:[245]
original: 'Ü' = hex [DC], valor:[220]
original: 'Ú' = hex [DA], valor:[218]
original: 'Û' = hex [DB], valor:[219]
original: 'ü' = hex [FC], valor:[252]
original: 'ú' = hex [FA], valor:[250]
original: 'û' = hex [FB], valor:[251]
original: 'ù' = hex [F9], valor:[249]
original: 'Ç' = hex [C7], valor:[199]
original: 'ç' = hex [E7], valor:[231]

 

Na mesma máquina na mesma hora, mas no terminal... Isso de acentos é um pesadelo.

 

Para você o que importa são esses números. Apenas anote e coloque em um vetor

 

 

E para você ver coo o problema é grande, no Linux e em alguns casos no Windows também você pode ter esses valores

para entrada[]:
 

image.thumb.png.06a83787da4b0987c2ed528b106dd5e4.png

Se o sistema usar Unicode essas letras viram codepoints Unicode, esses \unnnn aí... E o tamanho da string, que nada sabe sobre isso, passa a 92, o dobro, porque esses codepoints tem 2bytes cada um.

 

Para o à por exemplo o oficial é: https://www.fileformat.info/info/unicode/char/00c3/index.htm

 

image.png.f13906fadcae3119452f4df4221a9957.png

 

Isso para o sexto símbolo na sua lista, que aparece como C3 e o código 195...
 

Entrada com 46 simbolos:
original: '─' = hex [C4], valor:[196]
original: '┼' = hex [C5], valor:[197]
original: '┴' = hex [C1], valor:[193]
original: '┬' = hex [C2], valor:[194]
original: '└' = hex [C0], valor:[192]
original: '├' = hex [C3], valor:[195]
original: 'ß' = hex [E1], valor:[225]
original: 'Ô' = hex [E2], valor:[226]
original: 'Ó' = hex [E0], valor:[224]

 

Espero que tenha entendido.

 

De todo modo entenda que isso é um pesadelo. E tudo que tem que fazer no seu programa é trocar as letras. E esperar que saiam na tela. A menos que chame as funções certas, defina o locale, talvez a página de código e até a fonte,  e depois volte ao que estava antes

image.png

  • Curtir 1
Postado

@HUGO_dev_ze     a função fgets não remove os acentos e nem converte as letras acentuadas para não acentuadas ,  ela serve para ler uma quantidade de caracteres , que pode ser especificado , ou  usar o comando sizeof (nome_da_variavel) ,  para que seja especificado automaticamente ,  quase igual a função scanf ,  mas fgets pega o newline digitado e scanf não ,   e IDE  é o próprio codeblocks , e console é aquela janela preta que o codeblocks mostra ao executar seu código , e TerminaL é aquela tela preta do DOS , também chamada de prompt de comandos do windows , 

Postado

@devair1010 Terminal é um aplicativo. Não é aquela tela da console

 

 

image.png.2f4c464b94eec76503c542d3005e6c0b.png

 

 

A tela da console é essa marcada "tela de comando" que você pode acessar de várias maneiras, como por exemplo digitando Windows_R e teclando cmd e ENTER

 

 

A tela "do DOS" não existe desde os '90

 

O Terminal tem aceleração gráfica e caracteres Unicode por definição. TEm os emoji por exemplo.

 

O CMD --- a console --- em geral roda na página 850 e o Terminal na 65001

18 minutos atrás, devair1010 disse:

mas fgets pega o newline digitado e scanf não

 

"pega" apenas se couber na área alocada. Já te falei isso.

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!