maiden Posted April 15, 2006 at 08:31 PM Report #22268 Posted April 15, 2006 at 08:31 PM Mais uma vez estou a tentar elaborar um programa básico utilizando um array que receba 10 nomes. Sinceramente não encontro o erro 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,
Raven_fz2 Posted April 15, 2006 at 08:35 PM Report #22270 Posted April 15, 2006 at 08:35 PM Inicializar o x era boa ideia digo eu. int x=0;
maiden Posted April 15, 2006 at 08:37 PM Author Report #22272 Posted April 15, 2006 at 08:37 PM Pois, já tentei... mas continua a crashar 🙂 🙂 Cumps,
Marino Posted April 15, 2006 at 08:39 PM Report #22273 Posted April 15, 2006 at 08:39 PM 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++; } }
maiden Posted April 15, 2006 at 08:51 PM Author Report #22275 Posted April 15, 2006 at 08:51 PM Isto deve ter sido macumba :nono1: Continua sem funcar Sou memo chato... 🙂 Cumps,
Solution Marino Posted April 15, 2006 at 10:24 PM Solution Report #22289 Posted April 15, 2006 at 10:24 PM 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 ?
maiden Posted April 15, 2006 at 11:10 PM Author Report #22303 Posted April 15, 2006 at 11:10 PM Err... Pois... 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,
Gurzi Posted April 16, 2006 at 04:03 PM Report #22387 Posted April 16, 2006 at 04:03 PM 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
motherFFH Posted April 16, 2006 at 04:45 PM Report #22399 Posted April 16, 2006 at 04:45 PM 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).
redhat Posted May 1, 2006 at 04:31 PM Report #25108 Posted May 1, 2006 at 04:31 PM 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
maiden Posted May 1, 2006 at 05:57 PM Author Report #25119 Posted May 1, 2006 at 05:57 PM 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,
mogers Posted May 1, 2006 at 08:06 PM Report #25145 Posted May 1, 2006 at 08:06 PM 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.
espanhol Posted May 2, 2006 at 04:07 PM Report #25264 Posted May 2, 2006 at 04:07 PM ... 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"); }
Destineo Posted May 2, 2006 at 05:10 PM Report #25278 Posted May 2, 2006 at 05:10 PM 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
espanhol Posted May 2, 2006 at 05:17 PM Report #25279 Posted May 2, 2006 at 05:17 PM 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
Destineo Posted May 2, 2006 at 06:35 PM Report #25293 Posted May 2, 2006 at 06:35 PM Gosto de estar a relembrar C 🙂 Fui ver aqui: http://www.cplusplus.com/ref/cstdio/scanf.html e vi que a forma de evitar buffer overflows é definido um tamanho máximo que o fscanf deve ler, ou seja, scanf ("%[19]s",str); - Destineo - Destineo
mogers Posted May 2, 2006 at 08:16 PM Report #25322 Posted May 2, 2006 at 08:16 PM ... 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now