Jump to content
maiden

[Resolvido] Arrays - E a saga continua...

Recommended Posts

maiden

Mais uma vez estou a tentar elaborar um programa básico utilizando um array que receba 10 nomes.

Sinceramente não encontro o erro  :wallbash:

Alguma ajudinha?

#include <stdio.h>

main()
      {
      char nomes[10];
      int x;
      char nome;
      while (x<10)
            {
            printf("Introduza um nome");
            scanf("%s",nome);
            nomes[x]=(nome);
            x=(x+1);
            }
      }                  

Obrigado desde já  :)

Cumps,

Share this post


Link to post
Share on other sites
Marino

scanf("%s",&nome);  Falta o &

depois em vez de x=(x+1)  faz x++;   

...

#include <stdio.h>

main()
      {
      char nomes[10];
      int x=0;
      char nome;
      while (x<=10)
            {
            printf("Introduza um nome");
            scanf("%s",&nome);
            nomes[x]=nome;
            x++;
            }
      }

Share this post


Link to post
Share on other sites
maiden

Isto deve ter sido macumba  :nono1:

Continua sem funcar  :wallbash:

Sou memo chato...  :)

Cumps,

Share this post


Link to post
Share on other sites
Marino

Não funciona porque tu estás a tentar meter strings em variaveis char. Se escreveres só uma letra (char) o programa funciona, o que tens que fazer é alterar a maneira como gravas o input do teclado, para uma variavel que consiga guardar mais do que uma letra.

Vê se consegues fazer isso por ti próprio  :)

Se nao conseguires avisa, se conseguires avisa na mesma  😎

Share this post


Link to post
Share on other sites
maiden

Err... Pois...  :wallbash:

NOOOOOOOOOOOOOOOOOB!

Código (agora a funcionar):

#include <stdio.h>

main()
    {
    char nomes[10];
    int x=0;
    char nome[20];
    while (x<10)
        {
        printf("Introduza um nome");
        scanf("%s",&nome);
        nomes[x]=(nome);
        x++;
        }        
    }                  

Marino essa ultima pista foi boa  :)

Obrigado a todos e desculpem o assassinio da Lingua  :)

Cumps,

Share this post


Link to post
Share on other sites
Gurzi

nunca se grava uma string usando o &

faz algo do género, gets(nome);

e esse code nunca vai guardar 10 nomes diferentes, o que tu estás a fazer é um so nome.

para fazeres isso do nomes[x] terias que criar um array com 2 dimensões, penso eu que seria algo assim nomes[10][40] ;

ou seja podes ter 10 nomes e cada um pode ter 40 caracteres, corrijam-me se estiver errado.

um abraço

Share this post


Link to post
Share on other sites
motherFFH

Sim, é isso Gurzi. PElo que tenho visto aqui, seria melhor as pessoas começarem a aprender a programar começando com java, por exemplo. C é para os old-timers como eu (e mesmo assim já pouco o uso).

Share this post


Link to post
Share on other sites
redhat

hihihi no macintosh nao me deixa usar o gets();

qdo compilo ele nem cria o executavel, diz que nao tem erros, mas para nao usar essa funcao!!

scanf se nao estou em erro funciona mas e' esquesito!! tens de passar letra a letra!! mas nao deixa de ser um bom exercicio!


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
maiden

Já consegui fazer isto, graças à ajuda do amigo Gurzi (",).

Para escrever no elemento do array bastava a função sprintf.

Deixo aqui o código para os que tiveram dúvidas (como eu  :) )

#include <stdio.h>

main()
    {
    system("cls");
    char nomes[10][20],nome[20];
    int x=0;
    for (x=1;x<10;x++)
          {
          printf("Introduza um nome\n");
          scanf("%s",nome);
          sprintf(nomes[x],"%s",nome);
          }
    printf("%s\n",nomes[3]);
    system("pause");
    }

Cumps,

Share this post


Link to post
Share on other sites
mogers

Eu costumo usar o sprintf como uma funcao de conversão e nao como de cópia de strings... para isso temos o "string copy" strcpy da  string.h

strcpy( string_destino , string_origem );

ou o "memory copy" memcpy  também da  string.h    (mais eficiente)

memcpy( &string_destino , &string_origem , numero_de_bytes_a_copiar );

Ao usar scanf não consegues ler um linha de texto... o scanf chega ao espaço e para a leitura.

hihihi no macintosh nao me deixa usar o gets();

qdo compilo ele nem cria o executavel, diz que nao tem erros, mas para nao usar essa funcao!!

scanf se nao estou em erro funciona mas e' esquesito!! tens de passar letra a letra!! mas nao deixa de ser um bom exercicio!

o problema de usar o gets é esse, dá uns problemas... costumo usar fgets(string, numero_de_letras, stdin)  [fgets(nome,20,stdin); p.ex.]

o único inconveniente é k inclui o '\n' na string mas nada mais simples k o retirar  :)

De qualquer forma, podias ler o nome directamente no teu array    ---    scanf("%s",nomes[ x]);

P.S. o scanf recebe os endereços de memoria das variaveis que vai ler, daí os "&" que usamos ( &var dá o endereço de memoria da variavel)... no caso dum array, o nome do array é por si só um apontador para o endereço de memória da primeira posição, por isso é não se usa o "&" quando lemos uma string no scanf.

cumps


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
espanhol
...

permite-me uma pequena alteração:

#include <stdio.h>

main()
    {
    system("cls");
    char nomes[10][20];
    int x=0;
    for (x=1;x<10;x++)
          {
          printf("Introduza um nome\n");
          scanf("%s",nomes[x]); //podes gravar logo directamente para o array
          }
    printf("%s\n",nomes[3]);
    system("pause");
    }

Share this post


Link to post
Share on other sites
Destineo

Ok ok ... prometi a mim mesmo que não ia responder a nada sobre C, pois já há muito que não mexo, mas ... aqui vai  😡

espanhol, há um pequeno problema que pode vir a ser um problema maior que é no código:

scanf("%s",nomes[x]);

Ao fazeres isto, estas a fazer com que haja a possibilidade de haver 1 entrada para código "malicioso", ou seja, buffer overflows.

A variavel nomes tem um tamanho fixo que, através da função scanf, ao introduzires mais do que 20 caracteres, estarás a escrever por cima de uma zona de memória que não é tua. Isto é MUITO mau. Para além disso, o último caracter é/deve ser reservado para conter o \0, que representa o fim da string. Logo, o máximo que a string poderá conter é 19 caracteres.

Uma sugestão, para minimizar, e não eliminar completamente o problema, é criares um array com 256 posições (ou 512 ou um valor alto). Usares esse array como buffer, ou seja,

// Nao me lembro se em C podes inicializar um array assim, mas o que queres é preencher o array todo com o caracter fim de string
char buffer [1024] = '\0';
...

scanf("%s",buffer);
if (strlen(buffer) >= 20)
{ 
printf("Erro, por favor insira um nome com menos de 19 caracteres");
x--; // Para que a próxima iteração voltar a tentar preencher o nome x
}
else
{
strcpy(nomes[x],buffer);
}
memset(buffer,1024,'\0'); // Não me lembro se é assim a sintaxe, mas queremos voltar a limpar o array
...

Se isto for para um projecto e eu fosse prof, seria de certeza um dos primeiros testes que eu faria para tentar testar a robustez do programa.

- Destineo


- Destineo

Share this post


Link to post
Share on other sites
espanhol

penso que ao contrário do gets o scanf não permite b.o. .....

de qualquer das maneiras tens razão, nãio há nenhuma razão para não se reservar logo 256 ou 512 bytes para a string

Share this post


Link to post
Share on other sites
mogers

...
memset(buffer,1024,'\0'); // Não me lembro se é assim a sintaxe, mas queremos voltar a limpar o array

trocaste 2 parametros... seria

...
memset(buffer,'\0',1024);  // 1024 * sizeof(char) ... como sizeof(char) = 1 byte é omitido

esse código no scanf é mt interessante =)


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

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.