Erro no scanf [RESOLVIDO]

1. Erro no scanf [RESOLVIDO]

Ga
Ga X

(usa Ubuntu)

Enviado em 20/11/2017 - 15:43h

Pessoal eu sou um pouco novato ainda no Ubuntu e quando eu estava no Windows nao tinha muitos problemas para programar em C , também sou iniciante em programação e quando eu tento rodar esse codigo aparece tal problema.


O codigo esta aqui :

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int main()
{
int codigo;
char nome[30], controle;
float salario;

arquivo = fopen("cadastro.txt" , "w");

do
{
printf("Informe o codigo do colaborador : ");
scanf ("%i" , &codigo);
printf("\nInforme o nome do colaborador : ");
scanf("%s", &nome );
printf("\nInforme o salario do colaborador : ");
scanf ("%f" , &salario);

fprintf(arquivo , "%i %s %f" , codigo, nome, salario);

printf("\nDeseja cadastrar outro <s/n>:");
scanf ("%c", &controle);
}while (toupper (controle) == 'S');

fclose(arquivo);
}



Ai no Terminal aparece isso:

In function ‘main’:
codi.c:52:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
scanf("%s", &nome );
^


Ajuda ae pf .


  


2. Re: Erro no scanf

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 20/11/2017 - 17:21h

Copiei o seu código e compilei (com alguns ajustes). O estranho é que não recebi esse erro que você relata. Mas encontrei os seguintes problemas:

1. Cabeçalho stdio.h está incluído duas vezes;

2. A variável arquivo não foi declarada:

FILE * arquivo 


3. A leitura da variável controle tem um problema. A função scanf precisa de um pequeno ajuste pra ler caracteres. Se você coloca "%c" como parâmetro, ele considera espaços vazios que o terminal normalmente inclui antes da execução do comando, e acaba resultando em bugs. Por isso você deve incluir um espaço antes do parâmetro, isto é, " %c". Assim você informa à função scanf que deve ignorar esses espaços vazios.


Atualização:

4. (Este último foi o que ocasionou o alerta) A leitura da variável nome pode receber uma string de qualquer tamanho. Porém a variável tem tamanho fixo (30). Isso não implica em erros de compilação, mas pode causar problemas durante a execução. Por isso gera apenas um alerta, e não um erro.

---

Atenciosamente,
Hugo Cerqueira


3. Re: Erro no scanf [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/11/2017 - 12:08h

Ga X escreveu:

Pessoal eu sou um pouco novato ainda no Ubuntu e quando eu estava no Windows nao tinha muitos problemas para programar em C , também sou iniciante em programação e quando eu tento rodar esse codigo aparece tal problema.


O codigo esta aqui :

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>


Pode remover esta segunda inclusão do cabeçalho. Ela não chega a ser um erro, mas é redundante, e, como tal, gera ineficiência e complica a manutenção do código.

#include <ctype.h>

int main()


Essa delcaração de main, em C, significa que a função pode receber qualquer quantidade de parâmetros de quaisquer tipos, e é, em princípio, inadequada para uso em sistemas operacionais dos nossos PCs.

Há duas formas padronizadas para a delcaração de main em C:

  • Se você não quiser receber argumentos vindos do sistema operacional, deve declará-la como “int main(void)”.

  • Se você quiser receber tais parâmetros, deve declará-la como “int main(int argc, char **argv)”. Nesse caso, os argumentos serão passados na forma de um array de strings, contidas no vetor argv, e a quantidade de elementos nesse array é indicada no parâmetro argc. (Os nomes argc e argv são mera convenção; você pode usar outros nomes, desde que preserve os tipos e a ordem dos parâmetros).

{
int codigo;
char nome[30], controle;
float salario;

arquivo = fopen("cadastro.txt" , "w");


Como já apontou nosso colega na postagem anterior, faltou declarar arquivo.

do
{
printf("Informe o codigo do colaborador : ");
scanf ("%i" , &codigo);
printf("\nInforme o nome do colaborador : ");
scanf("%s", &nome );


Aqui você não deve usar “&nome”, mas apenas “nome”.

À conversão %s de scanf() deve corresponder um parâmetro do tipo char *, cujo valor indica o endereço do primeiro elementos de um array de caracteres que conterá a string lida. Quando você diz apenas “nome”, o tipo do argumento concorda com o que a função espera receber, pois arrays usados em expressões que não envolvam a aplicação dos operadores unários sizeof ou & têm como tipo resultante ponteiros para o tipo de seus elementos. Contudo, quando você diz “&nome”, você usa justamente o operador &, de modo que o tipo do argumento passa a ser ponteiro para o array inteiro de uma vez.

  printf("\nInforme o salario do colaborador : ");
scanf ("%f" , &salario);

fprintf(arquivo , "%i %s %f" , codigo, nome, salario);

printf("\nDeseja cadastrar outro <s/n>:");
scanf ("%c", &controle);
}while (toupper (controle) == 'S');

fclose(arquivo);


Que versão do C você esta usando? No Windows, até pouco tempo atrás, o padrão era usar ANSI C (1989). Nesse caso, você não deve sair de main() sem ser através de um comando return explícito ou uma chamada à função exit().

Versões mais recentes do padrão do C (1999, 2011) e todas as versões padronizadas do C++ assumem implicitamente um comportamento equivalente ao comando “return 0;”, caso se chegue ao final do bloco de main() sem um return ou exit() explícito.

} 



Ai no Terminal aparece isso:

In function ‘main’:
codi.c:52:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
scanf("%s", &nome );
^


Ajuda ae pf .









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts