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

jpedro7

Arrays multidimensionais

5 mensagens neste tópico

Quando executo este pequeno programa verifico que o array multidimensional que eu julgava carregado com linhas de texto aparece-me com lixo, como resolvo este problema ?.

Será que alguem pode dar uma ajuda ? O Código :

#include <stdio.h>
#include <string.h>

#define MAX_LN 25    /*   Máximo 26 Linhas    última linha é = END */
#define MAX_TEXTOS 9 /*   Máximo 10 Textos     */

int resultado;
int ind_titulo;
int tot_ln=0;
char texto_t[MAX_TEXTOS];
char texto_l[MAX_TEXTOS][MAX_LN];

int menu (void);
void inserir_textos (void);
void seleccionar_textos (void);

int main()
{
int opcao; 
for(;
{
	do
	{

		opcao = menu();
		switch(opcao)
		{
			case 1:
				inserir_textos();
				break;
			case 2:
				seleccionar_textos(); 
				break;
			case 3:
				return 0;
		}

	}while (resultado!='1' && resultado!='2' && resultado!='3');
}
}
int menu (void)
{
int opc;
printf("\n\n1 new...end \n");
printf("2 select\n");
printf("3 exit\n");
scanf ("%d", &opc);
return opc; 
}
void inserir_textos()
{
int i, z;
char texto[80];

printf("Inserir o Nome do Texto \n");
scanf("%s", &texto_t[tot_ln]);
printf("Titulo..Tabela..%s \n", &texto_t[0]);
for (i=0;i<26;i++)
{
	printf("Inserir linhas de Texto \n");
	scanf("%s", &texto_l[tot_ln][i]);
	if (strcmp(&texto_l[tot_ln][i], "end") == 0)
	{
		for(z=0;z<=25;z++)
		{
			if (strcmp(&texto_l[tot_ln][z], "end") != 0)
			{
				printf("Linhas...%s \n", &texto_l[tot_ln][z]);
			}
		}

		break;
	}
	printf("Linha...%s \n", &texto_l[tot_ln][i]);
}

tot_ln++;
}
void seleccionar_textos()
{

int i;
char texto[80];

printf("Digitar o Nome do Texto \n");
scanf("%s", &texto);
for(i=0;i<=9;i++)
{
	if (strcmp(&texto_t[i], texto) == 0)
	{
		printf("Texto...%s \n", &texto_t[i]);
		ind_titulo = i;
		break;
	}
}

for(i=0;i<=25;i++)
{
	if (strcmp(&texto_l[ind_titulo][i], "end") != 0)
	{
		printf("Linhas...%s \n", &texto_l[ind_titulo][i]);
	}
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

codigo correcto:

codigo

#include <stdio.h>

#include <stdio.h>
#include <string.h>

#define MAX_LN 25    /*   Máximo 26 Linhas    última linha é = END */
#define MAX_TEXTOS 9 /*   Máximo 10 Textos     */

int resultado;
int ind_titulo;
int tot_ln=0;
int tot_textos=0;
char texto_t[MAX_TEXTOS][24];
char texto_l[MAX_TEXTOS][MAX_LN][80];

int menu (void);
void inserir_textos (void);
void seleccionar_textos (void);

int main()
{
int opcao; 
for(;
{
	do
	{

		opcao = menu();
		switch(opcao)
		{
			case 1:
				inserir_textos();
				break;
			case 2:
				seleccionar_textos(); 
				break;
			case 3:
				return 0;
		}

	}while (resultado!='1' && resultado!='2' && resultado!='3');
}
}
int menu (void)
{
int opc;
printf("\n\n1 new...end \n");
printf("2 select\n");
printf("3 exit\n");
scanf ("%d%*c", &opc);
return opc; 
}
void inserir_textos()
{
int i, z;
char texto[80];




printf("Inserir o Nome do Texto: ");
fgets(texto_t[tot_textos],24,stdin);
printf("Titulo..%s Tabela..%d \n", &texto_t[tot_textos],tot_textos);
for (i=0;i<26;i++)
{
	printf("Inserir linhas de Texto: ");
	 fgets(texto_l[tot_ln][i],80,stdin);
	if (strcmp(texto_l[tot_ln][i], "end\n") == 0)
	{
		for(z=0;z<=25;z++)
		{
			if (strcmp(texto_l[tot_ln][z], "end\n") != 0)
			{
				printf("Linhas...%s \n", &texto_l[tot_ln][z]);

			}else{

			 break;
			  
			  }
		}

		break;
	}
	printf("Linha...%s \n", &texto_l[tot_ln][i]);

}
tot_ln++;
tot_textos++;

}
void seleccionar_textos()
{

int i,z;
char texto[80], var=0;



printf("Digitar o Nome do Texto: ");
fgets(texto,80,stdin);
for(i=0;i<=9;i++)
{        
	if (strcmp(texto_t[i], texto) == 0)
	{
	 var=1;
		printf("Texto...%s \n", &texto_t[i]);

		for(z=0;z<=25;z++){
		    
		     if(strcmp(texto_l[i][z], "end\n")!=0){
		        printf("Linhas...%s \n", &texto_l[i][z]);
		        }else{
			break;
			}
		}
		break;
	}
}

if(var==0){
   printf("Nenhum texto com esse nome %s\n", texto);
   }


}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

O teu código (o do jpedro7) tinha os seguintes warnings (compilando com o gcc 4.1.3 em linux):

../Teste2.c: In function ‘inserir_textos’:

../Teste2.c:53: warning: unused variable ‘texto’

../Teste2.c: In function ‘seleccionar_textos’:

../Teste2.c:86: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[80]’

Para começar se não estás a usar alguma variável não há necessidade de estar a alocar memória para ela. O segundo warning relaciona-se com o scanf e esta função aceita valores de memória (através de apontadores ou usando o operador de referenciação & a um tipo de dados). Como tinhas declarado anteriormente a variável texto como sendo um array de chars e como o nome do array é ele próprio o apontador para a primeira posição de memória alocada para esse array, não deves usar no scanf o operador & e simplesmente só o nome dessa variável, como está no código abaixo.

Só mais uma coisa: deves inicializar as tuas variáveis quando as crias. Na criação do array texto, as 80 posições que estás a alocar para os chars não são posições "limpas" quase de certeza. A memória não é estática, é alocada, escrita, limpa, etc... e por isso, se queres garantir que o teu array é inicializado com 80 posições limpas podes "settar" essas posições de memória a 0 (que corresponde a NULL em ASCII) como está indicado abaixo. Em termos de funcionalidade do teu código não incluí as alterações do zedlav.

#include <stdio.h>
#include <string.h>

#define MAX_LN 25    /*   Maximo 26 Linhas    ultima linha e' = END */
#define MAX_TEXTOS 9 /*   Maximo 10 Textos     */

/* prototipos */
int menu (void);
void inserir_textos (void);
void seleccionar_textos (void);

/* variaveis globais */
int resultado=0;
int ind_titulo=0;
int tot_ln=0;
char texto_t[MAX_TEXTOS]="";
char texto_l[MAX_TEXTOS][MAX_LN];

int main(void)
{
int opcao=0, nrTextos=0, nrLinhas=0; 

/* inicializacao do duplo array a NULL */
for (nrTextos=0;nrTextos<9;nrTextos++)
	for(nrLinhas=0;nrLinhas<25;nrLinhas++)
		texto_l[nrTextos][nrLinhas]='\0';

for(;
{
	do
	{

		opcao = menu();
		switch(opcao)
		{
			case 1:
				inserir_textos();
				break;
			case 2:
				seleccionar_textos(); 
				break;
			case 3:
				return 0;
		}

	}while (resultado!='1' && resultado!='2' && resultado!='3');
}
}
int menu (void)
{
int opc=0;

printf("\n\n1 new...end \n");
printf("2 select\n");
printf("3 exit\n");
scanf ("%d", &opc);
return opc; 
}
void inserir_textos(void)
{
int i=0, z=0;

printf("Inserir o Nome do Texto \n");
scanf("%s", &texto_t[tot_ln]);
printf("Titulo..Tabela..%s \n", &texto_t[0]);
for (i=0;i<26;i++)
{
	printf("Inserir linhas de Texto \n");
	scanf("%s", &texto_l[tot_ln][i]);
	if (strcmp(&texto_l[tot_ln][i], "end") == 0)
	{
		for(z=0;z<=25;z++)
		{
			if (strcmp(&texto_l[tot_ln][z], "end") != 0)
			{
				printf("Linhas...%s \n", &texto_l[tot_ln][z]);
			}
		}

		break;
	}
	printf("Linha...%s \n", &texto_l[tot_ln][i]);
}

tot_ln++;
}
void seleccionar_textos(void)
{

int i=0;
char texto[80]="";

printf("Digitar o Nome do Texto \n");
scanf("%s", texto);
for(i=0;i<=9;i++)
{
	if (strcmp(&texto_t[i], texto) == 0)
	{
		printf("Texto...%s \n", &texto_t[i]);
		ind_titulo = i;
		break;
	}
}

for(i=0;i<=25;i++)
{
	if (strcmp(&texto_l[ind_titulo][i], "end") != 0)
	{
		printf("Linhas...%s \n", &texto_l[ind_titulo][i]);
	}
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nenhuma das alterações funcionou.

Quando estou a inserir as linhas no array bidimensional o printf vem correcto mas quando acabo e vou listar o conteúdo da tabela não está correcto.

Exemplo:

Inserir nome do texto

Flores

Inserir Linhas

primeira 

Inserir Linhas

segunda

Inserir Linhas

terceira

Inserir Linhas

end

Linhas...pstend

Linhas...stend

Linhas...tend

Linhas...nd

Linhas...d

Linhas...

Linhas...ira

Linhas...ra

Linhas...a

Como podem vêr a listagem "Linhas..." está errado.

Como posso resolver ?

Estou a utilizar o Microsoft Visual Studio 2005( ful instalation) para compilar e linkeditar.

Obrigado pela ajuda.

	printf("Inserir o Nome do Texto \n");
//fgets(&texto_t[tot_textos],80,stdin);
scanf("%s", &texto_t[tot_ln]);
printf("Titulo..Tabela..%s \n", &texto_t[0]);
for (i=0;i<26;i++)
{
	printf("Inserir linhas de Texto \n");
	scanf("%s", &texto_l[tot_ln][i]);
	//fgets(&texto_l[tot_ln][i],80,stdin);
	if (strcmp(&texto_l[tot_ln][i], "end") == 0)
	{
		for(z=0;z<=25;z++)
		{
			if (strcmp(&texto_l[tot_ln][z], "end") != 0)
			{
				printf("Linhas...%s \n", &texto_l[tot_ln][z]);
			}
		}

		break;
	}
	printf("Linha...%s \n", &texto_l[tot_ln][i]);
}

tot_ln++;
tot_textos++;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#define MAX_LN 25    /*   Maximo 26 Linhas    ultima linha e = END */

- isto nao define linhas, define o numero de bytes em cada texto_l[MAX_TEXTOS].

#define MAX_TEXTOS 9 /*   Maximo 10 Textos     */ 
char texto_t[MAX_TEXTOS]; // 

  texto_t[MAX_TEXTOS] e igual a um vector com 9 bytes 

ex:

char texto_l[3][2][10];  /// isto e igual a 3 textos com 2 linhas, e cada linha tem 10 bytes. 

espero ter ajudado.

ps- nao contei com os "0"

0

Partilhar esta mensagem


Link 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