quer dizer: ler de stdin (ou seja, a entrada-padrão, que normalmente é o teclado, a não ser que redirecionada) uma linha, e jogar no buffer item.nome, cujo tamanho é 50.
Acostume-se a ler a documentação, e seu problema é o inglês, nada que o Google Translator não ajude.
A
alansystem
Minha pergunta é: me impede de usar scanf("%s",&item.nome);
?
V
ViniGodoy
Aliás, esse erro num .h (principalmente com classes) pode ser dificílimo de corrigir.
Isso pq se a struct for a última coisa declarada no .h, o erro dará no primeiro arquivo .cpp que fizer o include.
Aí até vc se ligar que a falta do ; está em outro arquivo, lá se foram algumas horas de dores de cabeça e xingamentos.
E
entanglement
alansystem:
Minha pergunta é: me impede de usar scanf("%s",&item.nome);
?
Claro que não. Só que o scanf é muito manhoso e perigoso nesse caso. Eu em particular não gosto nem um pouco de usá-lo (e xinguei muito o pessoal da Sun quando eles criaram a classe java.util.Scanner, que tem exatamente os mesmos defeitos e mais alguns).
a) Manha: se você entrar com uma string com espaços no meio (tipo “José Aparecido”), ele vai ler só até chegar ao primeiro espaço, e vai pôr a string “José” dentro de “item.nome” (aliás, é “item.nome”, não “&item.nome”. Nomes de arrays não precisam de “&”, e aliás isso pode dar até alguns problemas.).
b) Perigo: se você entrar com uma string sem espaços, mas com mais de 50 caracteres, o scanf vai simplesmente ler tudo que você digitou, e tentar copiar para item.nome. O problema, nesse caso, é que pode acabar sobreescrevendo alguma outra variável da sua aplicação, o que pode dar problemas muito difíceis de corrigir.
A
alansystem
Agora entendi, perfeito!
utilizar fgets apenas para char?
vlw as dicas!
A
alansystem
Aproveitando, não estou mai utilizando system(“pause”); agora estou utilizando no lugar getchar(); e após return 0; só não entendi direito o porquê do return 0; se alguém puder esclarecer ! vlw
V
ViniGodoy
Por que o main exige como valor de retorno um int.
Esse valor é retornado para o sistema operacional, na saída do processo.
Uma outra pergunta, o main() espera um retorno inteiro, mas não preciso declarar int main() né, por padrão é int certo? Pq eu nunca coloco, tem algum problema?
A
alansystem
Porque não exibe o valor de Nome Produto?
#include<stdlib.h>#include<stdio.h>typedefstructproduto{intcodigo;charnome_produto[50];intquantidade;floatvalor_compra;floatvalor_venda;};main(){produtoitem;printf("Digite o Codigo.......:");scanf("%d",&item.codigo);printf("Digite o Nome.........:");fgets(item.nome_produto,50,stdin);printf("%s",item.nome_produto);getchar();return0;}
Obrigado pela paciência de Todos!
E
entanglement
Em C você não precisa declarar o retorno de um método se ele retornar int.
Entretanto, é uma economia besta, e confunde quem vai ler seu código (quem é que se lembra de TODAS as regras do compilador C? Acho que nem o(s) cara(s) que definiu(ram) a linguagem - aliás, a versão atual - C99 - foi definida por um comitê, não por uma única pessoa.); é melhor você ser quadradinho, e declarar sempre que for possível.
De modo geral, é melhor fazer seu código conseguir compilar em C como se ele fosse compilável em C++ (onde você precisa realmente declarar o tipo de retorno do método).
A
alansystem
ok, serei quadrado e prometo retornar 0, palavra de escoteiro, brincadeira, vlw a dica!
E
entanglement
Por isso que eu “adoro” scanf. Para fazer isso funcionar direito dá um trabalho do cão; prefiro ler as linhas, uma de cada vez, e usar “sscanf”, que é um parente mais bem comportado do scanf (mas que lê de uma string, não diretamente do teclado).
#include<stdlib.h>#include<stdio.h>typedefstructproduto{intcodigo;charnome_produto[50];intquantidade;floatvalor_compra;floatvalor_venda;}PRODUTO;/* Dica: acostume-se a sempre declarar "main" do jeito abaixo. Assim, quando for aprender C++, isso já sairá "bitolado" do seus dedos. */intmain(intargc,char*argv[]){PRODUTOitem;/* pode usar "struct produto item" */printf("Digite o Codigo.......:");scanf("%d",&item.codigo);getchar();/* isto consome o "enter" que você deu depois do número */printf("Digite o Nome.........:");fgets(item.nome_produto,50,stdin);/* Note que fgets põe também o retorno de carro *//* A linha abaixo limpa o "\n" que foi lido pelo fgets. Argh */item.nome_produto[strlen(item.nome_produto)-1]='\0';printf("Nome do produto: [%s]\n",item.nome_produto);printf("Tecle ENTER para sair deste programa.");getchar();return0;}
E
entanglement
Dica.
Em C, exceto em alguns casos (por exemplo, você está usando alguma biblioteca de computação gráfica que usa floats, não doubles), é aconselhável usar double, nunca nunca float. (Isso é uma recomendação feita pelos autores da linguagem já em 1978, ou seja, há mais de 30 anos atrás. E isso quando computação de ponto-flutuante era uma coisa muito lenta e você tinha de ficar economizando CPU e bytes…)
A
alansystem
entanglement:
Por isso que eu "adoro" scanf. Para fazer isso funcionar direito dá um trabalho do cão; prefiro ler as linhas, uma de cada vez, e usar "sscanf", que é um parente mais bem comportado do scanf (mas que lê de uma string, não diretamente do teclado).
#include<stdlib.h>#include<stdio.h>typedefstructproduto{intcodigo;charnome_produto[50];intquantidade;floatvalor_compra;floatvalor_venda;}PRODUTO;/* Dica: acostume-se a sempre declarar "main" do jeito abaixo. Assim, quando for aprender C++, isso já sairá "bitolado" do seus dedos. */intmain(intargc,char*argv[]){PRODUTOitem;/* pode usar "struct produto item" */printf("Digite o Codigo.......:");scanf("%d",&item.codigo);getchar();/* isto consome o "enter" que você deu depois do número */printf("Digite o Nome.........:");fgets(item.nome_produto,50,stdin);/* Note que fgets põe também o retorno de carro *//* A linha abaixo limpa o "\n" que foi lido pelo fgets. Argh */item.nome_produto[strlen(item.nome_produto)-1]='\0';printf("Nome do produto: [%s]\n",item.nome_produto);printf("Tecle ENTER para sair deste programa.");getchar();return0;}