Ir ao conteúdo

Posts recomendados

Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

struct ListaArtista {
	char musica[50], artista[50];
	float duracao;
struct ListaArtista *prox;
};  struct ListaArtista *inicio, *meio, *fim, *aux;

void inserirMusica(){
	int c;

struct	ListaArtista *novo = (struct ListaArtista *)malloc(sizeof(struct ListaArtista));
	printf("\nSelecione a musica");
	 scanf_s(novo->musica, 49, stdin);

	printf("De qual artista? ");
	scanf_s(novo->artista, 49, stdin);

	printf("Duracao da musica? ");
	scanf_s("%f", &novo->duracao);

	while ((c = getchar()) != '\n' && c != EOF) {}   // Limpar buffer do teclado

	novo->prox = NULL;

	if (inicio == NULL)  		//A Fila esta vazia e iremos inserir o primeiro elemento
	{
		inicio = fim = novo;
	}
	else{
		fim->prox = novo;
		fim = novo;
	}
}
void LimparLista() {
	char ch;
	if (inicio == NULL) {
		printf("\nLista\n");
	}
	else {
		printf("s/n ");
		ch = getchar();
		if (ch == 's' || ch == 'S') {
			while (inicio != NULL) {
				aux = inicio;
				inicio = inicio->prox;
				free(aux); // Limpa o espaco da memoria
			}
			printf("\nLista vazia\n");
		}
	}
}

void VizualizarLista() {
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia!");
	}
	else {
		while (aux != NULL) {
			printf("musica:%s", aux->musica);
			printf("artista: %s", aux->artista);
			printf("duracao: %f\n\n", aux->duracao);
			aux = aux->prox;
		}
	}
	printf("\n");
}
void ProcurarMusica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\nLista vazia");
	}
	else
	{
		char musica[50];
		printf("Digite a faixa: ");
		scanf_s("%s", &aux);
		while (aux != NULL)
		{
			if (musica == aux->musica) {
				printf("\n Musica %s encontrada\n", aux->musica);
				printf("musica %s", aux->musica);
				printf("cantor:%s\n", aux->artista);
				return;
			}
			else {
				aux = aux->prox;
			}
		}
		if (aux == NULL) {
			printf("\nMusica %s não encontrada!", musica);
		}
	}
	printf("\n");
}
int main() {
	setlocale(LC_ALL, "");
	int opc, c;

	do {
		printf("1.Inserir música\n");
		printf("2.Procuar música\n");
		printf("3.Vizualizar lista\n");
		printf("4.Limpar lista\n");
		printf("5.Sair\n");

		printf("Escolha o opção!");
		scanf_s("%d", &opc);
		while((c == getchar()) != 'n' && c != EOF ) {}

		switch (opc) {
		case 1:
			inserirMusica();
				system("pause");
			break;
		case 2:
			ProcurarMusica();
			system("pause");
			break;
		case 3: 
			VizualizarLista();
			system("pause");
			break;
		case 4:
			LimparLista();
			system("pause");
			break;
		case 5:
			exit;
				break;
		default:
			printf("Opcão incorreta!");
			break;

		}
		system("cls");
	} while (opc != 5);
	return 0;
}

o seguinte erro está sendo apresentado:

main.c: In function inserirMusica’: main.c:17:3: warning: implicit declaration of function scanf_s [-Wimplicit-function-declaration] scanf_s(novo->musica, 49, stdin); ^~~~~~~ /tmp/ccoYoKWZ.o: In function `inserirMusica': main.c:(.text+0x3e): undefined reference to `scanf_s' main.c:(.text+0x71): undefined reference to `scanf_s' main.c:(.text+0x9a): undefined reference to `scanf_s' /tmp/ccoYoKWZ.o: In function `ProcurarMusica': main.c:(.text+0x2a2): undefined reference to `scanf_s' /tmp/ccoYoKWZ.o: In function `main': main.c:(.text+0x3da): undefined reference to `scanf_s' collect2: error: ld returned 1 exit status

 

Postado

Olá!

 

 

Você tem um livro-texto? Qual é? um manual ou algo assim? Que ambiente usa para rodar seus programas? Um IDE? qual?

 

Direto da documentação, em https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019


image.png.c501f929536ee35c2d5635b60f92f83c.png
 

Como resolveu usar scanf_s() ao invés de scanf()? Leu o manual?

 

Todas essas rotinas _s(), que são chamadas no conjunto de versões seguras, tem um parâmetro a mais para cada %c ou %s ou %[ e tal, como está no manual.

 

Achou que era só colocar _s no fim e continuar? E deu erro e você não desconfiou? Está errado. Leia o manual.

 

De todo modo, se usa o compilador da Microsoft deve ter lido na tela a mesma mensagem a cada vez que usou scanf()

image.thumb.png.568f076f00df858e656e77ab59ee96f5.png

 

Sim, pode usar um

 

#define _CRT_SECURE_NO_WARNINGS

 

e aí pode usar todas essas funções condenadas por não serem assim seguras, como scanf().

 

Ou você faz uma coisa ou outra. Ou usa o define e scanf() ou usa scanf_s() como está no manual...

  • Obrigado 1
Postado

@arfneto  olá amigo,usei o "define" e rodou o programa, porém não esta executando os comandos do menu do mesmo! uso o visual studio 2019, porém o mesmo começou a travar e agora estou usando um compilador online.. não sabia dessa do scanf mas obrigado.. segue o código :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define _CTR_SECURE_NO_WARNINGS
struct ListaArtista {
	char musica[50], artista[50];
	float duracao;
struct ListaArtista *prox;
};  struct ListaArtista *inicio, *meio, *fim, *aux;

void inserirMusica(){
	int c;

struct	ListaArtista *novo = (struct ListaArtista *)malloc(sizeof(struct ListaArtista));
	printf("\nSelecione a musica");
	 scanf(novo->musica, 49, stdin);

	printf("De qual artista? ");
	scanf(novo->artista, 49, stdin);

	printf("Duracao da musica? ");
	scanf("%f", &novo->duracao);

	while ((c = getchar()) != '\n' && c != EOF) {}   // Limpar buffer do teclado

	novo->prox = NULL;

	if (inicio == NULL)  		//A Fila esta vazia e iremos inserir o primeiro elemento
	{
		inicio = fim = novo;
	}
	else{
		fim->prox = novo;
		fim = novo;
	}
}
void LimparLista() {
	char ch;
	if (inicio == NULL) {
		printf("\nLista\n");
	}
	else {
		printf("s/n ");
		ch = getchar();
		if (ch == 's' || ch == 'S') {
			while (inicio != NULL) {
				aux = inicio;
				inicio = inicio->prox;
				free(aux); // Limpa o espaco da memoria
			}
			printf("\nLista vazia\n");
		}
	}
}

void VizualizarLista() {
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\n Lista vazia!");
	}
	else {
		while (aux != NULL) {
			printf("musica:%s", aux->musica);
			printf("artista: %s", aux->artista);
			printf("duracao: %f\n\n", aux->duracao);
			aux = aux->prox;
		}
	}
	printf("\n");
}
void ProcurarMusica()
{
	aux = inicio;
	if (inicio == NULL)
	{
		printf("\nLista vazia");
	}
	else
	{
		char musica[50];
		printf("Digite a faixa: ");
		scanf("%s", &aux);
		while (aux != NULL)
		{
			if (musica == aux->musica) {
				printf("\n Musica %s encontrada\n", aux->musica);
				printf("musica %s", aux->musica);
				printf("cantor:%s\n", aux->artista);
				return;
			}
			else {
				aux = aux->prox;
			}
		}
		if (aux == NULL) {
			printf("\nMusica %s não encontrada!", musica);
		}
	}
	printf("\n");
}
int main() {
	setlocale(LC_ALL, "");
	int opc, c;

	do {
		printf("1.Inserir música\n");
		printf("2.Procuar música\n");
		printf("3.Vizualizar lista\n");
		printf("4.Limpar lista\n");
		printf("5.Sair\n");

		printf("Escolha o opção!");
		scanf("%d", &opc);
		while((c == getchar()) != 'n' && c != EOF ) {}

		switch (opc) {
		case 1:
			inserirMusica();
				system("pause");
			break;
		case 2:
			ProcurarMusica();
			system("pause");
			break;
		case 3: 
			VizualizarLista();
			system("pause");
			break;
		case 4:
			LimparLista();
			system("pause");
			break;
		case 5:
			exit;
				break;
		default:
			printf("Opcão incorreta!");
			break;

		}
		system("cls");
	} while (opc != 5);
	return 0;
}

segue o erroimage.thumb.png.b9f6a7881ee8bbce3c460ad7c923575d.png

Postado
1 minuto atrás, Fernando Vieira disse:

não sabia dessa do scanf mas obrigado

 

Essa do scanf() apareceu na tela. Na sua tela, Você só não leu. Eu apenas compilei o seu programa e mostrei a mensagem

 

O define eu digitei errado!!! Desculpe!

O prefixo é _CRT de C RunTime

 

#define _CRT_SECURE_NO_WARNINGS

 

Outro usuário postou um programa aqui para o mesmo exercício com o MESMO erro...

 

Preste atençao às mensagens de erro. Em geral são bem descritivas, em especial nesse compilador...

 

Veja

erro.thumb.png.d447c2e5ae788431d03d0408a8742b01.png

 

Citação

c(85,9): warning C4477: 'scanf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'ListaArtista **

 

Pois é. Direto de seu programa:

struct ListaArtista {
	char musica[50], artista[50];
	float duracao;
	struct ListaArtista* prox;
};  struct ListaArtista* inicio, * meio, * fim, * aux;

Então aux é do tipo ListaArtista*. E veja o que você escreveu na tal linha 85
 

outro.png.cdc621d875d010f57e2c4c4274704bab.png

 

Tentou ler uma string passando o endereço de um ponteiro para sua lista. Nice!

 

Primeiro: não use variáveis globais. É uma bobagem. Sempre cai na sua cabeça. SEMPRE. Caras muito melhores que nós nisso dizem isso sem parar.

 

Agora se você sentir MESMO aquela necessidade de contrariar esses caras, ao menos não chame sua variável global de "aux". Use algo alerta, tipo

Lista_Artista* GLOBAL_tome_cuidado_aux = NULL:

 

E não use 4 ponteiros para uma mesma lista ligada com esses nomes folclóricos tipo inicio, meio, fim e aux. Em especial se você está aprendendo.

 

E se acostume a inicializar TODAS as variáveis.

 

Veja adiante
 

trecho.thumb.png.b0765ad7916cfbbba200be99e1536c35.png

Citação

(137,4): warning C4550: expression evaluates to a function which is missing an argument list


Pois é. E qual a expressão na linha 137?

 

aaaa.png.f4164d39a8ba4746b65c3931ebe4fce6.png

 

Então, exit é uma função e tem um argumento e está assim no manual

 

void exit(int status)

 

Não leu? Nem precisava. Veja na tela do visual studio... No seu programa:
 

exit.png.0e99b09829462868e94e9f561b3ff871.png

 

Cade o argumento? O Visual Studio está mostrando. Escreva exit(algo); Em geral se usa 0 para OK por razões históricas e pode usar até as constantes EXIT_SUCCESS ou EXIT_FAILURE como seu compilador teria tentado te dizer
 

exitou.png.44fa1fa84cf839c5df2bd03b65473607.png

 

Veja o palpite do tal Intellicode na sua tela

 

  • Obrigado 1
Postado

Não use variáveis globais. Nunca. É uma roubada.

 

Inicialize todas as variáveis.

 

Preste atenção às mensagens.


Seu programa tem os mesmos erros que o programa do outro cara... Não vai funcionar só porque compilou...

adicionado 3 minutos depois

Sugiro muito ler o que eu expliquei aqui...
 


É o mesmo programa. São amigos? ;) 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...