Jump to content

[Dúvida] input C


alves077

Recommended Posts

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

Link to comment
Share on other sites

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

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

Edited by alves077
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Edited by alves077
Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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];
       }
   }
}
Edited by 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!

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
×
×
  • 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.