Ir para o conteúdo
alves077

[Dúvida] input C

Mensagens Recomendadas

alves077

Boa noite,

Tenho que ler um input, que é uma espécie de matriz de char's, melhor várias matrizes em que a primeira linha e o tamanho da matriz (ex: 6 4 -> 6 linhas e 4 colunas) vindo depois os caracteres (ex: * ) expostos como a matriz deve ser, tendo depois de analisar a matriz, este formato podem existir uma só matriz como 10: 1ª linha o tamanho da matriz (linha,coluna); de seguida é mostrada a matriz, e assim sucessivamente até encontrar uma linha em branco. Alguma ideia a melhor maneira de guardar este input?

Tinha uma função fgets num while, como por exemplo:


while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0))
{
       scanf("%d %d",&rows, &columns);
       for(i=0;i<columns;i++)
           for(j=0;j<rows;j++)
           {
               scanf("%c",&teste[j][i]);
           }
}

Só que isto não bate certo, primeiro porque vou acabar por ler linhas repetidas. Mas a ideia era enquanto não encontrar linha em branco, verifica nova matriz guardava essa nova matriz e passava para a próxima, até encontrar linha em branco. Alguma ideia como resolver de maneira eficiente este problema?

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

diz se este é um exemplo dos dados de entrada:

(2 matrizes, uma de 3 linhas e 4 colunas e outra de 2 linhas e 5 colunas)

3 4
1 2 3 4
2 3 4 5
3 4 5 6
2 5
1 2 3 4 5
2 3 4 5 6

correcto ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o que eu não percebo é porque dizes que vais ler linhas repetidas

while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0))
{
       scanf("%d %d",&rows, &columns); // <--- isto já foi lido com o fgets !!!

altera para

while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0))
{
       sscanf(strg, "%d %d",&rows, &columns); // <---- estás a ler da string preenchida pelo fgets e não do stdin


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Edit..

Mas o código assim não lê, por exemplo o input que escreveste.

Ele lê um char em uma linha, penso eu...

E não era isso que pretendia, lesse quantas as linhas que tenho. Logo não preenche bem a matriz, nem termina quando deve terminar

Obrigado pela atenção,

alves077

Editado por alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Sim. está com um comportamento estranho.. não termina quando deve, as vezes não deve e termina...

Mas sendo um scanf("%c",&teste[j]); ele não insere as colunas bem, porque não lê dois caracteres na mesma linha.. acho eu..

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tens p'rai uns erros (o seguinte código é bem executado (para input bem computado)

#include <stdio.h>

#define max 10

int main()
{
char teste[max][max];
char strg[max];
int rows, columns, i, j;

while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0))
{
	sscanf(strg, "%d %d",&rows, &columns);
               // atenção à ordem rows/columns !!!!!!!!
	for(i=0;i<rows;i++)
	{
		for(j=0;j<columns;j++)
		{
                               // atencão à oredem i/j !!!!!!
                               // um espaço para ignorar caracteres de espaços/tabs/line carriage
			scanf(" %c",&teste[i][j]);
		}
	}
}

for(i=0;i<rows;i++)
{
	for(j=0;j<columns;j++)
		printf("%c", teste[i][j]);
	printf("\n");
}

return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

hm ok..

O erro dos indices já tinha modificado mas não avisei. O codigo que publicas-te termina logo após a 1ª matriz, não suporta mais do que uma matriz pelo que vi, ele não lê um '\n' a mais e depois sai do while?

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Sim, a minha ideia era com o while conseguir captar mais do que uma matriz, com os for's chegava para captar uma matriz. Ele nunca fica no while, parece me que a condição de comparar com o '\n' não é aceite, porque ele lê o ultimo \n, logo sai sempre, nao há maneira de ler esse suposto \n?

posso estar enganado mas e a ideia com que fico...

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se o problema é um '\n', então a maneira mais simples será:

while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0))
{
	sscanf(strg, "%d %d",&rows, &columns);
	for(i=0;i<rows;i++)
	{
		for(j=0;j<columns;j++)
		{
			scanf(" %c",&teste[i][j]);
		}
	}
	scanf("\n");
}

no entanto terás sempre de resolver o problema de ler somente uma matriz


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Pois, resolve um problema, mas acrescenta outro...

Já estou aqui a volta desde while, mas até agora nada. Terei que alterar o while para aceitar mais do que uma matriz? Pensava que assim chegaria mas não estou a conseguir obter o pretendido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Bom dia,

Já tentei de outra maneira mas sem sucesso:

int ent=0;
while((ent = getchar()) != '\n') && (ent != EOF))
{
  fgets(strg,MAX,stdin);
  sscanf(strg, "%d %d",&row, &columns);
/*...*/
}

Assim ele lê com getchar(), e fica no ciclo até o uma linha em branco, aqui tudo bem, mas o getchar() lê um caracter e depois o número de row e columns já não bate certo, por isso, resolvo um problema mas aparece outro. Conseguem dar uma ideia como resolver? Já andei aqui as voltas mas nada de muito relevante foi feito..

Já agora surgiu-me uma outra dúvida a nivel de sintaxe, queria comparar um char com uma barra lateral tipo '\', com posso fazer em c, já que ele não reconhece assim como uma barra lateral?

Obrigado pela atenção,

alves077

Editado por alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

REGRA #1

Usa sempre o valor devolvido pela maior parte das funcoes declaradas em <stdio.h>.

Esta regra aplica-se a funcao fgets()!

while (fgets(strg, MAX, stdin)) {
   if (sscanf(strg, "%d%d", &row, &columns) != 2) /* error */
   /* ... */
}

O caracter "barra invertida" pode ser especificado em C da seguinte forma

if (ch == '\\') /* barra invertida */;


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
alves077

Mas nesse caso acho que continuo ocm o mesmo problema

Por exemplo:



while (fgets(strg, MAX, stdin)) {
   if (sscanf(strg, "%d%d", &row, &columns) != 2) break;
               for(i=0;i<rows;i++)
               {
                       for(j=0;j<columns;j++)
                       {
                               scanf(" %c",&teste[i][j]);
                       }
               }

       }

Parece me que ele lê o \n e salta a próximo input de linhas e colunas, saindo assim logo a seguir de introduzir a 1ª matriz, mas ainda não consegui solucionar o problema... Como foi dito post's atrás com uma leitura de um \n nao funciona, porque tira um problema mas aparece outro, já andei aqui as voltas mas esta dificil..

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Mostra um exemplo dum input que da erro?

Cada elemento do array teste pode ser o que? um algarismo, uma letra, um asterisco, um sinal de menos, ...? Nao pode ser o que? um espaco, um TAB, um enter, ..

O input esta organizado por linhas?


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
alves077

Por exemplo:

3 4

* * * *

* * * *

* * * *

2 5

* * * * *

* * * * *

A matriz em si é de char, a 1ª linha dis as dimensões da matriz. É suposto parar quando lê uma linha em branco, quando não houver mais nada para ler. O input em principio não estará espaçado, isto é entre colunas não há espaço.

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se nao ha espaco entre colunas, para que puseste o espaco no scanf()?

primeiro passo: ler o numero de linhas e colunas.

segundo passo: num ciclo consoante o numero de linhas

terceiro passo: ler tantos caracteres quanto o numero de colunas e ignorar o fim de linha

Voila!

em codigo:

// primeiro passo
while (fgets(strg, MAX, stdin)) {
   if (sscanf(strg, "%d%d", &row, &columns) != 2) break;

   //segundo passo
   for (linha = 0; linha < row; linha++) {

       // terceiro passo (ler a linha toda duma vez)
       char caracteres[1000];
       /* nao misturar fgets() com scanf() */
       if (!fgets(caracteres, sizeof caracteres, stdin)) /* erro */ break;
       for (coluna = 0; coluna < columns; coluna++) {
           teste[linha][coluna] = caracteres[coluna];
       }
   }
}

Editado por pmg

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.