Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
ayperos

duvida simples e fácil de seleccionar

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
ayperos

então como é que defino a string? eu quero que ele leia "ola" para a posição 1. e quando escrevo ola ele rebenta :S

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.