Struct Linguagem C [Resolvido]

Galera alguém sabe o que pode estar de errado?
segue o print do erro http://anrsolucoes.com/images/erro.jpg

e o código abaixo!

[code]
#include<stdlib.h>
#include<stdio.h>

struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
}

main()
{
struct produto item;
printf(“Nome…:”);
fgets(item.nome,50,stdin);
printf(“Codigo…:”);
scanf("%d",&item.codigo);
printf(“Quantidade…:”);
scanf("%d",&item.quantidade);
printf(“Valor de Compra…:”);
scanf("%f",&item.valor_compra);
printf(“Valor de Venda…:”);
scanf("%f",&item.valor_venda);

system(“pause”);
}[/code]

A função “main” deve retornar um int.

arruma a assinatura da função para “int main()” e na ultima linha, depois de “system(“pause”);” tu coloca um “return 0”.

Não esqueça, também, do ponto-e-vírgual depois de fechar as chaves da struct

:smiley: Obrigado, batou colocar ; ao final do struct como o renamed informou, ai resolveu o problema vlw galera, estava com está buxa de cedo! :slight_smile:

Aproveitando o tópico, alguém saberia me explicar o porquê do uso do fgets e qual a diferença para scanf?

e esse stdin faz o que?

este código vi em um exemplo mas a única parte que não entendi direiro foi estes 2 códigos, Obrigado!

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

fgets(item.nome,50,stdin);

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.

Minha pergunta é: me impede de usar scanf("%s",&item.nome);

?

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.

Agora entendi, perfeito!

utilizar fgets apenas para char?

vlw as dicas!

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

Por que o main exige como valor de retorno um int.
Esse valor é retornado para o sistema operacional, na saída do processo.

Alguém poderia até programar um .bat, que testa esse valor:
http://www.robvanderwoude.com/errorlevel.php

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?

Porque não exibe o valor de Nome Produto?

#include&lt;stdlib.h&gt;
#include&lt;stdio.h&gt;

typedef struct produto{
       int codigo;
       char nome_produto[50];
       int quantidade;
       float valor_compra;
       float valor_venda;
       };


main()
{
      
 produto item;
 
 printf("Digite o Codigo.......:");
 scanf("%d",&item.codigo);
 printf("Digite o Nome.........:");
 fgets(item.nome_produto,50,stdin);
 printf("%s",item.nome_produto);
 
 getchar();      
 return 0;
}

Obrigado pela paciência de Todos!

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

ok, serei quadrado :smiley: e prometo retornar 0, palavra de escoteiro, brincadeira, vlw a dica!

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

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

[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!

Ah, é que no seu compilador o método strlen fica no “#include <string.h>” . Sorry - meu compilador (Visual C++) não reclamou disso.