• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

maiden

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

18 mensagens neste tópico

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,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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++;
            }
      }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto deve ter sido macumba  :nono1:

Continua sem funcar  :wallbash:

Sou memo chato...  :)

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
...

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");
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :rant_01:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

...
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 =)

0

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