Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
bom, estou com problema para fazer um programa.
Vou receber varias linhas de texto, atraves do fgets, onde terá:
nome
salario
salario2
ex:
>
Fulano de tal
33000.00
300.00
eu gostaria de saber como ler isso e separar em vetores individuais, pensei em fazer com struct.
struct pagamento{
char nome[50]; //nome da pessoa
float salario; //salario da pessoa
float salario2; //comissao da pessoa
}pessoa[100][100];
onde as linhas seriao os nomes, e nas colunas os valores, mas estou um pouco ainda confuso como usar o struct com vetores, poderiam me dar uma ajuda de como fazer isso e consequentemente ja entender o struct com vetores?
obrigado
Não precisa utilizar um array multidimensional para isso. Basta um vetor simples (pessoa[100]).
Cada posição do vetor pessoa vai ter uma estrutura do tipo pagamento.
Para acessar os valores, utilize:
pessoa.nome;
pessoa.salario1;
pessoa.salario2;
Espero ter ajudado, FLW!
uhm, obrigado pela
>
struct pagamento {
char nome[50];
float salario, salario2;
};
int main(void) {
struct pagamento registros[100];
.....
}
O '\n' funciona como delimitador no fgets. O nome vai ser lido normalmente (com espaços, inclusive), mas você precisa se preocupar com o seguinte:
1- Tamanho do array de char p/ armazenar o nome
2- Funcionamento do fgets
O segundo item explica-se pela manpage da função: http://linux.die.net/man/3/fgets
Então, como o '\n' acaba fazendo parte do dado, vc precisa colocar o '\0' delimitador nessa posição. E provavelmente não vai ter problemas com o '\n' perdido na entrada padrão quando for ler outras strings. No caso dos salários, vc pode usar fgets em conjunto com o sscanf (http://stackoverflow.com/questions/8551723/fgets-combined-with-sscanf).
http://linux.die.net/man/3/sscanf
Obrigado pela resposta, mas me apareceu um problema.
tenho este codigo:
struct pagamentos{
char nome[1000];
float salario;
float comissao;
};
int i,j,l,c,k,tamanho = 0;
float salarioBase = 0;
char vetor[1001];
struct pagamentos pg[100];
while(1){
k=0;
printf("Nome: ");
fgets(pg[k].nome, 1000, stdin);
printf("\n");
printf("Salario: ");
scanf("%f", &pg[k].salario);
printf("\n");
printf("comissao: ");
scanf("%f", &pg[k].comissao);
printf("\n");
k++;
}
Nesse codigo ele nao aparece tudo certinho, parece que na 2 pra frente execução ele pula a parte de nome, e vai direto pra salario ficando assim:
Nome: Salario:
estou fezendo com o while, pq dentro dele preciso ter uma condiçao de que se no NOME estiver escrito FIM ele de break, que tbm nao estou conseguindo arrumar, com vetor era assim:
tamanho = strlen(vetor);
if((tamanho >=3) && (vetor[0] == 70) && (vetor[1] == 73) && (vetor[2] == 77)){
//printf("Caractere achado FIM \n");
break;
}
como posso arrumar isso pra utilização com struct, infelizmente ja tentei de tudo e nao deu certo ?
obrigado
Isso acontece porque o \n fica na entrada após a leitura (o scanf não "limpa" o stdin após a leitura, a grosso modo).
Existe um tópico de "boas práticas" ou dicas em C no qual se discute isso. Se eu não me engano está em destaque. Dê uma olhada lá.
eu acabei nao achando, desculpe-me.
aparentemente ele ta reconhecendo o enter depois do scanf da comissao, e ele acaba entrando no fgets, o que eu poderia fazer para arrumar este problema?
######EDIT#####
Acabei achando, como vc falou o scanf deixa um lixo no fgets mesmo, entao eu coloquei um getchar depois do ultimo scanf
Como nao conseguir editar o topico acima, tive que responder novamente, estou com o problema para fazer a ordenação em relação ao salario no caso, quero listar todos os nomes que possuam tal salario, mas nao faço a minima ideia de como fazer. Tbm preciso ordenar alfabeticamente, mas ja sei como fazer, vou comparar o valor delas por strcmp
if(strcmp(p[k].nome, p[k].nome) > 0){
p[m].nome = p[k].nome
}
ta certo isso?
obrigado
struct pagamento {
int main(void) {
O '\n' funciona como delimitador no fgets. O nome vai ser lido normalmente (com espaços, inclusive), mas você precisa se preocupar com o seguinte:
1- Tamanho do array de char p/ armazenar o nome
2- Funcionamento do fgets
O segundo item explica-se pela manpage da função: http://linux.die.net/man/3/fgets
Então, como o '\n' acaba fazendo parte do dado, vc precisa colocar o '\0' delimitador nessa posição. E provavelmente não vai ter problemas com o '\n' perdido na entrada padrão quando for ler outras strings. No caso dos salários, vc pode usar fgets em conjunto com o sscanf (http://stackoverflow.com/questions/8551723/fgets-combined-with-sscanf).
http://linux.die.net/man/3/sscanf