Jump to content
PlayMa256

[Resolvido] Problema com cadeia de caracteres

Recommended Posts

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

Edited by pmg
GeSHi

Share this post


Link to post
Share on other 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 ...

Edited by pmg
toUpper corrigido

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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Edited by PlayMa256

Share this post


Link to post
Share on other sites
HappyHippyHippo

disseste que usavas isso para saber se é acentuado. essa função não serve para isso !


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

Share this post


Link to post
Share on other 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;
}

Edited by 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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites
pmg

Tens que fazer

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

Sem esquecer o #include <ctype.h>!

Edited by 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.