Ir para o conteúdo
PlayMa256

[Resolvido] Problema com cadeia de caracteres

Mensagens Recomendadas

PlayMa256    0
PlayMa256

Bom dia,

bom, estou com um problema, tenho uma cadeia de caracteres que estou recebendo e estou passando para um vetor N, desta maneira:

char vetor[100];
int i;

   fgets(vetor, 100+1, stdin);
for(i=0;i<100;i++){

}

e preciso passar o vetor todo pra uppercase e procurar por letras com acento e potuações, porem nao sei muito bem como fazer, sei que a funçao strcmp compara 2 caracteres e retorna 0, 1, ou -1, porem nao sei com o que posso comparar para achar estes caracteres e apaga-los.

podem me ajudar?

obrigado

Editado por pmg
GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

primeiro de tudo vamos aos erros que tens no teu código (sim, tens erros no teu código)

char vetor[100];            // <- estás a dizer que o array tem 100 elementos do tipo caracter
int i;

fgets(vetor, 100 + 1, stdin); // <- estás a dizer à função fgets que o array tem 101 ... isto pode muito bem estoirar ...

for(i = 0; i < 100; i++) {
}

agora por partes :

- passar o array todo para maiúsculas :

podes usar a função toupper (é para cada caracter mas com isso já te safas)

- ler caracteres acentuadados e pontuções :

se bem que pontuação é todo o caracter que não é alpha numérico e não é espaço, o caso dos caracteres acentuados, terás vários problemas.

a maneira mais simples será pesquisares por bytes com um valor superior a 127 e considerar que esse byte e o seguinte é um caracter acentuado.

- a função strcmp

essa função não compara dois caracteres mas sim duas strings completas !!!

- apagar caracteres

o mais simples é usares um array auxiliar e copiar para lá somente o que te interessa, porque caso contrário, terás de andar a mover memória ...

Editado por pmg
toUpper corrigido

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Nao uses 100+1 para o tamanho passado para fgets(). O tamanho correcto é 100.

    fgets(vetor, 100, stdin);
   /* ou
   fgets(vetor, sizeof vetor, stdin); */

A funcao strcmp() compara strings, não compara caracteres.

Para verificares se um determinado caracter está em maiuscúlas podes usar a função isupper(), declarada no header <ctype.h>.

#include <ctype.h>
/* ... */
   if (isupper((unsigned char)vetor[42])) /* whatever */;

Também existe a função islower(), que verifica se um caracter está em minúsculas.

Mas, para as tuas necessidades, também declarada no header <ctype.h>, tens a função toupper().

O meu conselho é que apliques essa função a todos os caracteres (válidos) do array.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Xpirito    3
Xpirito

Ja fiz algo parecido com isso.

No meu caso declarei outro vector igual

percorri o vector e usei a função toupper.h da libraria ctype.h ( esta info procurei na net e é fácil de encontrar)

se na posiçao do vetor N encontrasse pontuações ou sinais escrevia exactamente na mesma posição no novo vector.


Para perguntas idiotas, respostas estúpidas!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PlayMa256    0
PlayMa256

mesmo eu passando varias linhas neste vetor, onde cada linha tem no max 100 eu continuo declarando no fgets 100?

se eu setar o toupper(vetor) ele ja passa direto?

pra eu pesquisar caracteres acentuados eu pequiso por um com 127 bytes e o proximo será a acentuação? como por exemplo do á ? 127 será o a e o proximo a acentuação? como posso fazer isso pra mover para um outro vetor ?

para procurar acentuação vou fazer assim, creio que esteja correto.

if((islpha(vetor[i])) == 0) || (isblank(vetor[i]))) ){
  //nao será um caractere, entao do um strcpy pra um outro array e desapaceço com o a pontuação certo?
}

e pra caracteres acentuados?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

mesmo eu passando varias linhas neste vetor, onde cada linha tem no max 100 eu continuo declarando no fgets 100?

o fgets recebe o tamanho do array, se o array tiver 100, então será esse o valor a ser dado à função.

se eu setar o toupper(vetor) ele ja passa direto?

os posts que foram apresentados incluem links para páginas com a documentação das funções, era suposto lerem a informação fornecida.

a função retorna o valor do caracter em maiúscula (se for possível). fazer sobre o valor não o altera.

pra eu pesquisar caracteres acentuados eu pequiso por um com 127 bytes

não foi isso que eu disse !!!

bytes com um valor superior a 127

e o proximo será a acentuação?

eu nunca disse isso !!!

considerar que esse byte e o seguinte é um caracter acentuado como por exemplo do á ? 127 será o a e o proximo a acentuação?

como posso fazer isso pra mover para um outro vetor ?

terás de copiar os dois bytes

para procurar acentuação vou fazer assim, creio que esteja correto.

if((islpha(vetor[i])) == 0) || (isblank(vetor[i]))) ){
  //nao será um caractere, entao do um strcpy pra um outro array e desapaceço com o a pontuação certo?
}

nop. islpha não existe (vou assumir que seja isalpha), no entanto isso não te encontra os caracteres acentuados.

e pra caracteres acentuados?

já te foi dito acima ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

e pra caracteres acentuados?

Xiiiii ... primeiro verifica muito, muito bem se os teus caracteres acentuados têm a mesma codificação no ambiente de desenvolvimento e no ambiente de execução.

Depois, dependendo da codificação configurada, com C99, podes usar as funções declaradas em <wchar.h> e <wctype.h> (parecidas com as funções declaradas em <ctype.h> para versões anteriores de C).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PlayMa256    0
PlayMa256

nop. islpha não existe (vou assumir que seja isalpha), no entanto isso não te encontra os caracteres acentuados.

já te foi dito acima ...

erro de digitação, é isalpha(vetor)...neste caso, nao verificarei se é um alphanumerico ou n?

Xiiiii ... primeiro verifica muito, muito bem se os teus caracteres acentuados têm a mesma codificação no ambiente de desenvolvimento e no ambiente de execução.

Depois, dependendo da codificação configurada, com C99, podes usar as funções declaradas em <wchar.h> e <wctype.h> (parecidas com as funções declaradas em <ctype.h> para versões anteriores de C).

Como posso saber se a codificação é a mesma?

Editado por PlayMa256

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Como posso saber se a codificação é a mesma?

Escreve directamente do teclado (não faças copy/paste) o programa seguinte e corre-o.

Se o resultado for "esquisitices" a codificação usada nos dois ambientes (desenvolviemnto e execução) não é a mesma.

#include <stdio.h>
int main(void) {
   printf("A Conceição e o ANTÓNIO estão cá!\n");
   return 0;
}

Depois experimenta este outro programa

#include <stdio.h>
#include <wchar.h>
int main(void) {
   wprintf(L"A Conceição e o ANTÓNIO estão cá!\n");
   return 0;
}

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PlayMa256    0
PlayMa256

apareceram erros de codificação mesmo....

aconteceu um erro, tentei colocar o toupper(vetor) ele da o seguinte warnining:

warning: passing arg 1 of `toupper' makes integer from pointer without a cast|

se eu coloco ele dentro do for, com o toupper(vetor) e depois faço um printf("%c", vetor) ele nao me mostra o vetor com os caracteres em maiusculo, fiz algo de errado?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Tens que fazer

printf("%c", toupper((unsigned char)vetor[i]));

Sem esquecer o #include <ctype.h>!

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PlayMa256    0
PlayMa256

se eu for manipular o vetor depois de colocar em maiusculo, colocar o toupper ja ira funcionar para depois eu poder fazer manipulações com o vetor?

Digo isso porque, farei a procura de algumas letras em maiusculo.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.