Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ayperos

duvida simples e fácil de seleccionar

Mensagens Recomendadas

ayperos

Boas tardes,

Bem a minha duvida é muito simples.

Estou a fazer um jogo (jogo do quadrado) e preciso de saber como leio strings.

eu tenho um array de strings (char *jogadores[5] = {"windows", "linux", "mint", "fedora", "mac os"};) Quando vou para ler para modificar a posição 1, por exemplo. O programa rebenta.

a forma como estou a tentar ler: scanf("%c", jogadores[1]);

Já tentei com o & no jogadores mas nada.

cumps,

Ayperos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Sabes que o scanf escreve para memória já alocada, correcto? Se estiveres a escrever mais letras que o tamanho de cada uma das palavras com que inicializaste, estás a ultrapassar o espaço que foi alocado para cada um dos ponteiros.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Ao declarares o array como sendo de char*, e inicializando-o com strings literais, estás a fazer com que essas strings sejam read-only, ou seja, só podem ser lidas, não podem ser alteradas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ayperos

Alguma sugestão?

eu vou inserir aqui o código para vocês verem.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio2.h>
#define MAX_SCREEN_AREA 100
int n = 2;
char *jogadores[5]={"windows","ubuntu","mint","fedora","mac os"};
char *pecas[1][5]={"@","#","$","%","&"};
/*Codigo para crear menu principal*/
void menus()
{
int i, i1;
clrscr();
for (i = 0; i < 9; i++)
{
	if (i == 0 || i == 8)
	{
		for (i1 = 0; i1 < 20; i1++)
		{
			printf("*");
		}
	}
	if (i > 0 && i < 8)
	{
		printf("*");
		if (i == 1)
		{
			printf(" Jogo do Quadrado ");
		}
		if (i == 3)
		{
			printf("    1 - Jogar     ");
		}
		if (i == 4)
		{
			printf("    2 - Opcoes    ");
		}
		if (i == 5)
		{
			printf("    3 - Sair      ");
		}
		if (i != 1 && i != 3 && i != 4 && i != 5)
		{
			for (i1 = 0; i1 < 18; i1++)
			{
				printf(" ");
			}
		}
		printf("*");
	}
	printf("\n");
}
}
/*Codigo para crear menu opcao*/
void menuop() /*Menu das opções */
{
int  i, i1;
	clrscr();
	for (i = 0; i < 9; i++)
	{
		if (i == 0 || i == 8)
		{
			for (i1 = 0; i1 < 27; i1++)
			{
				printf("*");
			}
		}
		if (i > 0 && i < 8)
		{
			printf("*");
			if (i == 1)
			{
				printf("  Jogo do Quadrado       ");
			}
			if (i == 3)
			{
				printf("  1 - Numero de jogadores");
			}
			if (i == 4)
			{
				printf("  2 - escolher nickname  ");
			}
			if (i == 5)
			{
				printf("  3 - escolher peca      ");
			}
			if (i == 6)
			{
				printf("  4 - Menu principal");
			}
			if (i != 1 && i != 3 && i != 4 && i != 5)
			{
				for (i1 = 0; i1 < 25; i1++)
				{
					printf(" ");
				}
			}
			printf("*");
		}
		printf("\n");
	}

}
int nrjogadores() /*numero de jogadores*/
{
clrscr();
do
{
	printf("Introduza o nº de jogadores (2-5): \n");
	scanf("%d", &n);
}
while (n < 2 || n > 5);
return n;
}
void peca(int n) /*peça para cada jogador*/
{
int cont = 0;
clrscr();
printf("digite agora com que caracter deseja jogar. \n");
do
{

	printf("jogador %s digite o seu caracter: ", jogadores[cont]);
	scanf("%s", pecas[cont]);
	cont++;
	printf("\n");
}
while (cont != n);
}
void nicks(int n) /* nickname dos jogadores */
{
int cont = 0;
do
{

	clrscr();
	printf("digite o nome do jogador %d : \n", cont+1);
	scanf("%c", jogadores[cont]);
	cont++;
}
while (cont != n);
}


/*int gotoxy(int x, int y)//função gotoxy
{
char essq[MAX_SCREEN_AREA]={0}; // String variable to hold the escape sequence
sprintf(essq, "\033[%d;%df", y,x);
printf("%s", essq);
return 0;
}*/
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
void loader ()
{
int n;
for (n = 0; n <= 10; n++)
{
	printf("Loading:  ");
	if (n == 0)
	{
		printf("** 0%% **\n");
	}
	if (n > 0 && n < 11)
	{
		printf("** %d0%% **\n", n);
	}
	if (n == 10)
	{
		printf("Go Play!!\n");
	}
	wait(1);
	system("clear");
}
}
void gam(void)
{
int x, y, a = 0, i = 0;
char tab[8][8] = {{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'},
	{'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'}, {'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'}
};
do
{
	printf("   1 2 3 4 5 6 7 8 \n");
	printf(" 1 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[0][0], tab[0][1], tab[0][2], tab[0][3], tab[0][4], tab[0][5], tab[0][6], tab[0][7]);
	printf("   |=| |=| |=| |=|  \n");
	printf(" 2 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[1][0], tab[1][1], tab[1][2], tab[1][3], tab[1][4], tab[1][5], tab[1][6], tab[1][7]);
	printf("   |=| |=| |=| |=| \n");
	printf(" 3 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[2][0], tab[2][1], tab[2][2], tab[2][3], tab[2][4], tab[2][5], tab[2][6], tab[2][7]);
	printf("   |=| |=| |=| |=| \n");
	printf(" 4 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[3][0], tab[3][1], tab[3][2], tab[3][3], tab[3][4], tab[3][5], tab[3][6], tab[3][7]);
	printf("   |=| |=| |=| |=|\n");
	printf(" 5 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[4][0], tab[4][1], tab[4][2], tab[4][3], tab[4][4], tab[4][5], tab[4][6], tab[4][7]);
	printf("   |=| |=| |=| |=|\n");
	printf(" 6 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[5][0], tab[5][1], tab[5][2], tab[5][3], tab[5][4], tab[5][5], tab[5][6], tab[5][7]);
	printf("   |=| |=| |=| |=|\n");
	printf(" 7 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[6][0], tab[6][1], tab[6][2], tab[6][3], tab[6][4], tab[6][5], tab[6][6], tab[6][7]);
	printf("   |=| |=| |=| |=|\n");
	printf(" 8 %c-%c-%c-%c-%c-%c-%c-%c\n", tab[7][0], tab[7][1], tab[7][2], tab[7][3], tab[7][4], tab[7][5], tab[7][6], tab[7][7]);
	printf("\n");
	for (i = 1; i <= n;i++)
	{
		printf("%c tem x quadrados\n", jogadores[n]);
	}
	printf("cord x: ");
	scanf("%d", &x);
	printf("cord y: ");
	scanf("%d", &y);
	printf("\n");
	if (tab[x-1][y-1] == '*')
	{
		printf("posicao ja ocupada");
	}
	else
	{
		tab[x-1][y-1] = '*';
	}
	a++;
	clrscr();
}
while (a != 4);
}
int main()
{
int	op,op1;
menus();
do{
printf("digite a opcao: ");
scanf("%d", &op);
switch (op)
{
case 1:
	clrscr();
	gam();
	break;
case 2:
	do{
	clrscr();
	menuop();

	printf("digite a opcao: ");
	scanf("%d", &op1);
	switch (op1)
	{
	case 1:
		nrjogadores();
		break;
	case 2:
		nicks(n);
		break;
	case 3:
		peca(n);
		break;
	case 4:
		menus();
		break;
	default:
		printf("opcao invalida\n");
		break;
	}}while(op1!=4);

	break;
case 3:
	clrscr();
	printf("realizado por:\n16434 Goncalo Veiga || 16254 Pedro Santos");
	exit(0);
	break;
default:
	printf("Opcao invalida\n");
	break;
}
}while(op !=3);
return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Usa um arrays de arrays em vez dum array de ponteiros:

char jogadores[5][8] = {"windows", "ubuntu", "mint", "fedora", "mac os"};

Nota que usei 8 no "segundo nivel" do array para ter tamanho suficiente para a string mais comprida ("windows" + terminador). Se achas que vais utilizar strings ainda mais compridas, altera o tamanho em consonancia (ou impoe um limite máximo abstracto, tal como char jogadores[5][1200]).

Não te esqueças de validar os inputs de acordo com o tamanho máximo definido.

E não te esqueças de contar com o terminador!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Para ler uma palavra a maneira mais cómoda é usando o "%s" do scanf, possivelmente com um limitador de tamanho

if (scanf("%7s", jogadores[0]) != 1) /* error */;

Se precisas de ler palavras com espaços ("mac os") aconselho-te que o faças com a função fgets(). Dá um pouco mais trabalho, mas é muito mais poderosa que scanf().

Normalmente a gestão do terminador (o '\0') é automática. Só precisas de te certificar que tens espaço para ele nos arrays.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.