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

x3minater

Strings em vectores!

16 mensagens neste tópico

Boas

Como é que eu faço para guardar uma string (introduzida pelo utilizador durante o programa) num vector?

Ex:

Código:

printf("\tReferencia:");
while ((ch = getchar()) != '\n'){
  ref_p[i++] = ch;
}
ref_p[i] = '\0';

Agora como é que eu guardo o "ref_p[ ]" num elemento dum vector (ex: n_prodr[n])?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya...Acho que é isso!  ;)

Thanks, não me tava a lembrar!  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

n_prodr[n]=ref_p;

Mas como é que eu declaro o n_prodr[n]?

Se eu fizer assim:

(código incompleto)

1 int n_prodr[10];
2
3 printf("\tReferencia: ");
4			while ((ch = getchar()) != '\n'){
5				ref_p[i++] = ch;}
6			ref_p[i] = '\0';
7			n_prodr[n] = ref_p;
8
9 printf("%s", n_prodr[n]);

o compilador diz:

"7:warning: assignment makes integer from poiner without a cast

9:warning: format argument is not a pointer <arg 2>"

Como é que eu declaro o n_prodr[n] e como é que eu o ponho no printf( )?

Alguém me pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim à primeira vista, o n_prodr vai ser um vector de strings (char* n_prodr[10], por exemplo).

Atenção à forma como colocas a string no vector, pois assim vais chegar ao fim com a última palavra escrita em todas as strings

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção à forma como colocas a string no vector, pois assim vais chegar ao fim com a última palavra escrita em todas as strings

posso fazer assim:

1 int n=0;
2 char* n_prodr[10];
3 printf("\tReferencia: ")
4			while ((ch = getchar()) != '\n'
5				ref_p[i++] = ch
6			ref_p[i] = '\0';
7			n_prodr[n++] = ref_p;
8
9 printf("%s", n_prodr[n]);

?

(Se isto tivesse dentro dum ciclo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vais estar a rescrever sempre a mesma string, por isso no final vais ter o mesmo valor em todas. Vê o strdup

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê o strdup

Mas eu não quero copiar strings... quero é que as strings passadas pelo utilizador passem para o ecran...

Tenho este código, mas depois de escrever 3 strings...da-me "core dumped"! :S

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

int main(void){
int p=0, a=0, n, i=0, op=1;
char* v[10], ch, ref_p[6];

do{
p++;
	printf("\tReferencia: ");
		while ((ch = getchar()) != '\n'){
			ref_p[i++] = ch;}
		ref_p[i] = '\0';
		v[a++] = ref_p;


		if(a==10)
		 op=2;
}while(op!=2);

for(n=0; n<p; n++){
	a=0;
	printf("%s", v[a]);
	a++;
	}

return 0;
}

O que é que tá mal ai?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dentro do do ... while devias passar a variável i para 0 (ou seja, devias fazer isso antes de cada leitura). Caso contrário, os novos valores lidos, serão colocados em ref_p depois dos valores anteriormente lidos, e acabas com uma string com todos os valores e não com uma string com cada valor.

Mas quando fizeres isso, vais ter o problema de estar a escrever uns valores por cima dos outros, e chegas ao fim apenas com a última string (em repetida em todas as posições de v), daí que precises do strdup.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E assim já dá? ;)

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

int main(void){
int p=0, a=0, n, i, op=1;
char* v[10], ch, ref_p[6];

do{
p++;
i=0;
	printf("\tReferencia: ");
		while ((ch = getchar()) != '\n'){
			ref_p[i++] = ch;}
		ref_p[i] = '\0';
		v[a] = strdup(ref_p);
		a++;

		if(a==10)
		 op=2;
}while(op!=2);

for(a=0; a<p; a++){
	printf("%s", v[a]);
	}

return 0;
}

Ja agr...em vez de estar a abrir outro topico...

Podemos passar uma string, de uma estrutura, para um vector de strings?

EX:

struct bla
{
char descr [70+1];	
struct produtos *prox;
}
typedef struct bla BLA;

BLA *walker;
int v[10];
int i;

for(i=0; i<10; i++){
n=0;
walker2->descr = v[n++];
}

Pode-se fazer isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya, axo que já ta bom... so que me dá uns warnings:

testar.c:15: warning: implicit declaration of function strdup

testar.c:15: warning: assignment makes pointer from integer without a cast

(linha 15 é a do strdup)

Como é que eu os corrijo??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deve faltar um #include <string.h>.

Ta la...

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

int main(void){
int p=0, a=0, i, op=1;
char* v[5], ch, ref_p[6];

do{
p++;
i=0;
	printf("\tReferencia: ");
		while ((ch = getchar()) != '\n'){
			ref_p[i++] = ch;}
		ref_p[i] = '\0';
		v[a] = strdup(ref_p);
		a++;

		if(a==5)
		 op=2;
}while(op!=2);

for(a=0; a<p; a++){
	printf("%s\n", v[a]);
	}

return 0;
}

testar.c:15: warning: implicit declaration of function strdup

testar.c:15: warning: assignment makes pointer from integer without a cast

:S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu nem com a flag -Wall tenho esse warning.

Eu to a compilar com o putty assim:

"gcc -g -ansi -pedantic -Wall ref.c -o ref"

e dá-me esses warnings...:S

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