Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PlayMa256

[Resolvido] Problema com cadeia de caracteres

Mensagens Recomendadas

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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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


Ligação 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.