Jump to content

[C] Ajuda: String arrays


rgcaldas
 Share

Recommended Posts

Boas

Estou a iniciar-me em C, e encalhei numa cena.

Gostaria de saber se consigo fazer algo do genero com arrays:

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

int main(void) {
char opcoes[3][10][50]; //3-menus 10-opcoes por menu 50-caracteres por opcao

opcoes[0][0][0] = "[G]estão de Artigos";
opcoes[0][1][0] = "[C]onsumos";
opcoes[0][2][0] = "[T]erminar Aplicação";

}

Desde já obrigado por qualquer ajuda

Ricardo Gomes

Link to comment
Share on other sites

Mas queres fazer um menu certo? Com um Switch case fazes isso melhor.

Quanto ao que fizeste não vejo problema nenhum, mas sem dares mais informações sobre o problema não te posso dizer mais...

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Link to comment
Share on other sites

Desculpem não me ter explicado bem.

A ideia é cria uma função para gerir os menus da aplicação, e passar o array como argumento.

Eu tenho 3 menus para fazer e queria poupar nos printfs e nas funções necessárias para mostrar os menus

tipo isto:

int menu(char opcoes, int menu) { // a variavel menu serve para dizer á função qual o menu a apresentar
int x=1,i;
char op;

do {
  for (i=0;i <3;i++) { // 3 é o numero de opções de cada menu
    printf("\n%c",opcoes[menu][i][0]);
  }
  scanf("%c",&op)
  switch(op){
  //.... codigo do switch a colocar x = 0 se o user escolher uma opção correcta
  }

}while (x==1);
}

Obrigado novamente pela ajuda

Link to comment
Share on other sites

acho que é mais isto o que tu queres...

opcoes[0][0] = "[G]estão de Artigos";
opcoes[0][1] = "[C]onsumos";
opcoes[0][2] = "[T]erminar Aplicação";

O terceiro nivel tem a ver com eu querer colocar no array 3 menus com 10 opções cada.

Quanto ao que fizeste não vejo problema nenhum, mas sem dares mais informações sobre o problema não te posso dizer mais...

Realmente tens razão, os erros eram só warnings

Mas continuo com um problema quando tento passar o array dentro da função num printf dá-me o seguinte erro:

"error:subscripted value is neither array nor pointer"

O codigo todo que tenho até agora é:

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

int menu(char opcoes, int m);


int main(void) {
int m;
char opcoes[3][10][50]; //3-menus 10-opcoes por menu 50-caracteres por opcao

opcoes[0][0][0] = "[G]estão de Artigos";
opcoes[0][1][0] = "[C]onsumos";
opcoes[0][2][0] = "[T]erminar Aplicação";

m = 1;
menu(opcoes,m);

}

int menu(char opcoes, int m) { // a variavel menu serve para dizer á função qual o menu a apresentar
int x=1,i;
char op;

do {
  for (i=0;i <3;i++) { // 3 é o numero de opções de cada menu
    printf("\n%c",opcoes[m][i][0]);
  }
  scanf("%c",&op);
  switch(op){
  //.... codigo do switch a colocar x = 0 se o user escolher uma opção correcta
  }

}while (x==1);
}
Link to comment
Share on other sites

tens que fazer como eu disse!!!

continuas a colocar 3 níveis na declaração, mas o último nível é para os vários caracteres da string.

por isso, ou fazes

opcoes[0][0] = "[G]est&#227;o de Artigos";

ou

opcoes[0][0][0]='[';
opcoes[0][0][1]='G';
opcoes[0][0][2]=']';
opcoes[0][0][3]='e';
opcoes[0][0][4]='s';
opcoes[0][0][5]='t';
...
Link to comment
Share on other sites

Antes de mais, bem vindo ao fórum rgcaldas.

Para esclarecer dúvidas sobre o código C, existe uma secção própria (Tópico movido)

Não concordo com o Rui Carlos, isso não é possível fazer assim em C (pelo menos o compilador não devia aceitar isso).

Só é possível isso na declaração das variáveis, tipo isto:

char variavel[100]={"Gestão de artigos"};

Mas não é isto que queres fazer, então o que fazes é uma cópia de strings e o modo que é o mais aconselhável é:

strcpy(opcoes[0][0],"Gestao de artigos");

Ter atenção que declaras a variavel opcao assim:

char opcoes[3][10][50];

Ou seja, a variável opcao é um apontador de apontadores, logo não podes passar a variavel para uma função como um char mas sim como um char**.

O outro pormenor/conselho, não escrevas na consola letras com acentos e til (á, ã, é, ...) se não arriscas a ver caracteres esquisitos na consola.

Cumpr. bk@ero  :P

Link to comment
Share on other sites

? é da minha vista ou estás a definir as opções para o menu 0 e depois vais tentar imprimir é o menu 1 que ainda não tem lá nada?

Outra coisa, no printf tens %c, assim só vais imprimir o primeiro caracter de cada opção.

Link to comment
Share on other sites

continuas a colocar 3 níveis na declaração, mas o último nível é para os vários caracteres da string.

Desculpa Rui, não tinha percebido o que querias dizer.

Antes de mais, bem vindo ao fórum rgcaldas.

Para esclarecer dúvidas sobre o código C, existe uma secção própria (Tópico movido)

Obrigado brink@ero, e peço desculpa pelo engano, não volta a acontecer(espero).

Só é possível isso na declaração das variáveis, tipo isto:

char variavel[100]={"Gestão de artigos"};

Sim, acabei por fazer assim, não seguei a esperimentar a forma do Rui.

O outro pormenor/conselho, não escrevas na consola letras com acentos e til (á, ã, é, ...) se não arriscas a ver caracteres esquisitos na consola.

Sim, os acentos foi só por estava a escrever o codigo para por aqui.

? é da minha vista ou estás a definir as opções para o menu 0 e depois vais tentar imprimir é o menu 1 que ainda não tem lá nada?

Outra coisa, no printf tens %c, assim só vais imprimir o primeiro caracter de cada opção.

Obrigado SacoPlastico, já alterei.

Obrigado a todos, o codigo acabou por ficar assim, se acharem que devo mudar algo digam:

int main(void) {
int m=0,i,x=1,n=3;
char opcoes[3][10][50]={
{{"[G]estão de Artigos"},{"[C]onsumos"},{"[T]erminar Aplicacao"}},
{{"[A]tribuir cartao"},{"[R]egistar consumo"},{"[E]fectuar pagamento"},{"[L]ibertar cartao"},{"[C]onsultar consumos"}},
{{"[A]dicionar Artigos"},{"[R]emover Artigos"},{"[V]isualizar Artigos"}}
},op;

do {
	op = menu(opcoes,m,n);
	if (op != 'x'){
		switch(m){ //Verifica qual o menu
			case 0:
				switch(op){//Verifica a opção do menu 0
					case 'g':
					case 'G':
						gestArt();
					break;
					case 'c':
					case 'C':
						gestCons();
					break;
					case 't':
					case 'T':
						x=0;
					break;
					default:
						printf("Por favor, escolha uma das opcoes");
					break;
				}// fim do switch do menu 0
			break;
			case 1:

			break;
			case 2:

			break;
		}
	}
}while(x!=0);
return 0;

}

char menu(char opcoes[3][10][50], int m,int n) { // a variavel m serve para dizer á função qual o menu a apresentar
int x=1,i,valchar,y;
char op[10];

y = sizeof(opcoes[m]);
printf("%d%d",n,y);
for (i=0;i <n;i++) { 
	printf("\n%s",opcoes[m][i]);
}
fflush(stdin);
valchar = scanf("%s",op);//trocar a variavel para char no Windows e testar
if (valchar==1){
	return op[0];		
}

}

P.S. Apesar da opção GeSHI estar selecionada, o codigo não apace com devia, falta fazer alguma coisa?

Link to comment
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
 Share

×
×
  • Create New...

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.