Jump to content
Halaster

[Resolvido] Obtenção de caracteres duma string

Recommended Posts

Halaster

Boas!!

O meu problema é o seguinte:

Eu tenho uma string deste género "................................", e queria atribuir a uma variável temporária(char), um caractere para depois o comparar com outro e inserir o valor numérico correspondente num array[linhas][colunas], mas não sei como é que conseguirei ler o caractere e atribuí-lo à variável temporária. :confused::P

Será que me podem ajudar?

Share this post


Link to post
Share on other sites
entering
int cont=0;
char temp;
while (cont<strlen(string)) {
  temp=string[cont];
  /* Aqui fica a parte do code para a comparação e atribuição a matriz
  Nao percebi bem o que queres fazer mas pelo que percebi so tinhas duvida com a atribuição
  ve se isto te ajuda senão avisa que volto a postar (mas desta vez faz-te entender um pouco melhor*/
  ++cont;
}

Share this post


Link to post
Share on other sites
Warrior
int i;
char s[30];
gets(s);
for (i=0;i<strlen(s);i++) {
//tens aqui o ciclo para percorrer a string, a cada iteração o caracter correspondente ficará guardado na variável s[i]
}

Share this post


Link to post
Share on other sites
Warrior

Erro? Acho que até pelo contrario

enquanto que o scanf("%s",s) só lê uma palavra, o gets(s) lê uma linha. O que usarias em sua vez?

fgets() ?

Share this post


Link to post
Share on other sites
Dani

Eu também considero um erro usar o gets.

Isto porque ao usar o gets ele guarda os caracteres todos até encontrar um \n.

Ora isso pode ser perigoso principalmente se usarmos shared memory, pois imaginem que teem uma variavel que lê as iniciais de um clube de futebol por exemplo. Pedimos ao user para inserir as iniciais, e guardamos num char inicias[5]. Se o user escrever o nome completo em vez das iniciais, por exemplo Vitória de Guimarães, não vai ficar unicamente gravado na variavel "Vitór", mas sim tudo o que foi introduzido.

Resumindo usando o gets corremos o risco de a variavel a ser lida ocupe o espaço destinado a outras variáveis, podendo modifica-las. O melhor mesmo será o fgets 🤔.

Espero ter sido ilucidativo.

Cumps

Share this post


Link to post
Share on other sites
Warrior

Isso de buffers overflow é um problema já inerente ao C.. mas sim, quando sugeri o fgets foi exactamente por esse motivo.

Share this post


Link to post
Share on other sites
Gurzi

gostei imenso deste tópico, agora expliquem-me só a diferença do fgets para o gets sff :)

Share this post


Link to post
Share on other sites
entering

Isso de buffers overflow é um problema já inerente ao C.. mas sim, quando sugeri o fgets foi exactamente por esse motivo.

Pode ser inerente a C mas não é inerente ao programador, alias nem sequer devia existir gets mas apenas fgets, existem outros casos que podem causar seg faults, ex: usar getwd em vez de getcwd

gcc -Wall pap.c

/var/tmp//ccFnSJyg.o(.text+0x24): In function `main':

: warning: warning: this program uses gets(), which is unsafe.

Sequer pensar usar o gets é uma estupidez, podes usar o fgets ou podes usar caracter a caracter ate atingir um maximo ou encontrar um \n antes.

O uso de fgets por vezes pode dar asneira a principiantes pois no caso de no input tentar-se meter strings maiores que o que aceita o fgets o resto dos caracteres ficam estilo pendente, sendo assim seram lidos pelo próximo fgets!

Existem maneiras de suprimir esse lixo incluindo mudar a forma como esta a ser feito o input, por defeiro o input é feito até receber um enter mas é possivel modificar isso. :)

NOTA:

Quando falei do getwd é possível usa-lo com segurança se usarmos a biblioteca limits.h e fizermos uma declaração da string do genero char variavel[PATH_MAX];

Share this post


Link to post
Share on other sites
Warrior

para quem não sabe, pode limpar os caracteres pendentes, como disse o entering, usando o fflush(stdin);

Share this post


Link to post
Share on other sites
motherFFH

O fflush() só deve ser usado em streams de escrita. O objectivo é escrever efectivamente na stream dados que estejam em memória (buffering). fflush(stdin) é um uso errado e não faz nada.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • 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.