Ir ao conteúdo

Posts recomendados

Postado

Digitei o seguinte código, o que está errado?

#include <stdio.h>

int main ()
{
char matrx [100][5];
char *p;
int count;

p=matrx[0][0]='a';
p=matrx[0][1]='e';
p=matrx[0][2]='i';
p=matrx[0][3]='o';
p=matrx[0][4]='u';

for (count=0; count<500; count++)
{
*p="aeiou";
printf("%c", *p);
p++;
}

return(0);
}

 

  • Obrigado 1
  • Haha 1
  • Triste 1
Postado

@Tati Schein    creio que uma matriz de ponteiro seja com dois asteriscos . 

  e provavelmente seja melhor reservar espaço na memória para guardar esses dados  , e isso você consegue usando a funcao malloc e no fim do programa não esqueça de liberar esses espaços usando a função free .

Postado

@Tati Schein    não entendi por que você criou uma matriz normal e sendo que você Quer fazer usando ponteiros , então creio que seja melhor fazer com ponteiro mesmo desde o início e seu código poderia ser assim , :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void __Sleep(int);
int main ()
{
    char matrx [10][5];
    char **mp;
    int count;
    mp = (char**)malloc(10 * sizeof(char*));
    int i;
    for(i=0; i <10; i++)
    {
        mp[i] = (char*)malloc( 5 * sizeof(char));
        mp[i][0] = 'a';
        mp[i][1] = 'e';
        mp[i][2] = 'i';
        mp[i][3] = 'o';
        mp[i][4] = 'u';
        printf("%3d -: ",i+1);
        printf("%c "  ,mp[i][0]);
        printf("%c "  ,mp[i][1]);
        printf("%c "  ,mp[i][2]);
        printf("%c "  ,mp[i][3]);
        printf("%c \n",mp[i][4]);
        __Sleep(300);  // milisegundos
    }
    __Sleep(1000);  // hum segundo
    printf("\n");
    for(i=0; i<10; i++)
    {
        printf("%3d -: ",i+1);
        for(int j=0; j<5; j++)
        {
            printf("%c ", mp[i][j]);
        }
        printf("\n");
    }
    free(mp);
    printf("      Tecle\n\n\n";
    getch();
    return 32768;
}
void __Sleep(int t)
{
    int f,n;
    for(f=0; f<t*100; f++)
        for(n=0; n<6000; n++);
}

 

Postado

 

#include <stdio.h>

int main ()
{
char matrx [100][5];
char *p;
int count;

p=matrx[0][0]='a';
p=matrx[0][1]='e';
p=matrx[0][2]='i';
p=matrx[0][3]='o';
p=matrx[0][4]='u';

for (count=0; count<500; count++)
{
*p="aeiou";
printf("%c", *p);
p++;
}

 

Esta errado mesmo...

p é char*, um ponteiro para char. E estava apontando para matrx[0][4]


E aí você escreve essa linha
 

*p = "aeiou";


O que é "aeiou"? const char[6]. E *p é o que? char, já que p é char*

 

O que você quer fazer?

 

Se quer redefinir alguma das 100 matrx[5] deve usar o endereço de inicio das duas strings

 

Que pretende com essas linhas:
 

	p = matrx[0][0] = 'a';
	p = matrx[0][1] = 'e';
	p = matrx[0][2] = 'i';
	p = matrx[0][3] = 'o';
	p = matrx[0][4] = 'u';

 

Não há razão para escrever isso. Não está usando p para nada e reatribuindo a toda hora. Para que? E porque matrx e não matrix? economizar um i e ficar mais difícil de ler e escrever?

 

Entenda que as strings em C terminam por ZERO. o tal null. Não pode escrever com tentou se pretende usar isso como 100 strings. Entenda isso: ou aumenta para 6 ou usa só 4. Cada uma delas tem que terminar por zero ou não vai poder por exemplo usar %s para mostrar na tela... ;) 

 

Algo como

 

const char* novo = "1234";
memcpy( matrx[99], novo, strlen(novo) );

 

É o que quer fazer

 

Exemplo

 

Saida 

==>
Primeira string: 'aeio'

Os 5 primeiros

i=  0, matr[i,0]='I000'
i=  1, matr[i,0]='I001'
i=  2, matr[i,0]='I002'
i=  3, matr[i,0]='I003'
i=  4, matr[i,0]='I004'

Os 5 ultimos

i= 95, matr[i,0]='I095'
i= 96, matr[i,0]='I096'
i= 97, matr[i,0]='I097'
i= 98, matr[i,0]='I098'
i= 99, matr[i,0]='I099'

 

e o programa
 

#include <stdio.h>

int main()
{
	char matrx[100][5];

	printf("==>\n");

	char* p = &matrx[0][0];
	*p = 'a';	p++;
	*p = 'e';	p++;
	*p = 'i';	p++;
	*p = 'o';	p++;
	*p = 0;	
	printf("Primeira string: '%s'\n", matrx[0]);

	p = (char*) matrx;
	for (int count = 0; count < 100; count++)
	{
		sprintf(p, "I%03d\0", count);
		p += 5;
	};
	// os 5 primeiros
	printf("\nOs 5 primeiros\n\n");
	for (int i = 0; i < 5; i += 1)
		printf("i=%3d, matr[i,0]='%s'\n",
			i, matrx[i]);
	// os 5 ultimos
	printf("\nOs 5 ultimos\n\n");
	for (int i = 95; i < 100; i += 1)
		printf("i=%3d, matr[i,0]='%s'\n",
			i, matrx[i]);
	return 0;
}

 

Esse faz o que você tentou fazer:

  • atribui os valores, usando letras, para a primeira string 
  • depois numera as 100 strings e monta como strings
  • mostra as 5 primeiras
  • mostra as 5 últimas.

 

Entenda que

  • C não tem nada como "matrizes" como na linguagem FORTRAN. Só existem vetores. Uma dimensão. E então pode e deve usar matrx[X] com um índice só, para acessar as strings.
  • C tem aritmética de ponteiros então ao escrever matrx[i] ao somar um em i o ponteiro anda na verdade 5 bytes.
  • Essa é a mesma razão pela qual você tem que escrever no primeiro for, p+=5;
  • tenha muito claro porque p+=5; e não *p += 5;...

É claro que se quer 100 strings com 5 vogais vai precisar de SEIS posições para cada uma. Tanto faz se vai alocar 

    char    matrix[100][6];
    char**  matrixB;
    char*   matrixC;

 

Mas ao decidir por um caminho você deve construir a tal 'matriz' de acordo com o que declarou. repito: em C não existe nada além de vetor[X]. E isso é normal e bom.

  • Curtir 1
  • Obrigado 1
  • Haha 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!