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.
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.
[quote=alansystem]Minha pergunta é: me impede de usar scanf("%s",&item.nome);
?[/quote]
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.
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
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?
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).
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>
typedef struct produto {
int codigo;
char nome_produto[50];
int quantidade;
float valor_compra;
float valor_venda;
} PRODUTO;
/* Dica: acostume-se a sempre declarar "main" do jeito abaixo.
Assim, quando for aprender C++, isso já sairá "bitolado" do seus dedos. */
int main (int argc, char *argv[]) {
PRODUTO item; /* 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();
return 0;
}
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…)
[quote=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).
[code] #include <stdlib.h> #include <stdio.h>
typedef struct produto {
int codigo;
char nome_produto[50];
int quantidade;
float valor_compra;
float valor_venda;
} PRODUTO;
/* Dica: acostume-se a sempre declarar “main” do jeito abaixo.
Assim, quando for aprender C++, isso já sairá “bitolado” do seus dedos. */
int main (int argc, char *argv[]) {
PRODUTO item; /* 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();
return 0;
}
[/code][/quote]
Por algum motivo a linha item.nome_produto [strlen (item.nome_produto) - 1] = '\0'; está constando que está errado!