Não consigo varrer um ponteiro :( [RESOLVIDO]

1. Não consigo varrer um ponteiro :( [RESOLVIDO]

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 07/12/2021 - 18:44h

Boa Tarde a todos

Não estou conseguindo varrer um ponteiro quando ele é um vetor de string (Se minha referência está correta)
Tentei inúmeras combinações, porém sei que meu problema é que não sei encontrar o fim do vetor.
E sempre ensinam na internet a usar while(*Text != '\0') que não é aceito atualmente

char *Text[] = {"Text1", "Text2", "Text3"};
int x = 0;

//while(*Text != '\0') { // error: comparison between pointer and zero character constant [-Werror=pointer-compare]
//while(Text[0] != '\0') // Não está parando ao final
puts(Text[x++]);

Não vale isso: while(x < 3)
Porque não sei o Tamanho do vetor! Pra saber o tamanho eu teria que pegar via código, mas não sei também usar o sizeof neste caso, ou qualquer outra forma para saber o tamanho.

Pois o vetor que estou capturando é o abaixo e não vem com tamanho informado!
Por isso montei separado o exemplo mais simples acima!
int main(int argc, char **argv, char **envp) {
int x = 0;
char *String = envp[x];



  


2. MELHOR RESPOSTA

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 07/12/2021 - 22:16h

ApprenticeX escreveu:

Heitor.rj escreveu:

ApprenticeX escreveu:
Porque não sei o Tamanho do vetor! Pra saber o tamanho eu teria que pegar via código, mas não sei também usar o sizeof neste caso, ou qualquer outra forma para saber o tamanho.

Use o sizeof assim:
int x = 0;
while(x < sizeof Text / sizeof Text[0])
puts(Text[x++]);

// Outra forma
int x = 0;
while(x < sizeof Text / sizeof *Text)
puts(Text[x++]);

// Usando for
for(int x = 0; x < sizeof Text / sizeof Text[0];)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof Text[0]; x++)
puts(Text[x]);

for(int x = 0; x < sizeof Text / sizeof *Text;)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof *Text; x++)
puts(Text[x]);

Seu exemplo funcionou para
char *Text[] = {"Text1", "Text2", "Text3"}; 

Mas não consegui aplicar em
int main(int argc, char **argv, char **envp) {
int x = 0;
char *String = envp[x];
Eu achei que teria o mesmo comportamento, mas as variáveis não são a mesma coisa.

Então faz assim:
#include <stdio.h>

int main(int argc, char **argv, char **envp) {
while(*envp)
printf("%s\n\n", *envp++); // Pulei 2 linhas para ficar mais legível
}




3. Re: Não consigo varrer um ponteiro :(

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 07/12/2021 - 20:10h

ApprenticeX escreveu:
Porque não sei o Tamanho do vetor! Pra saber o tamanho eu teria que pegar via código, mas não sei também usar o sizeof neste caso, ou qualquer outra forma para saber o tamanho.

Use o sizeof assim:
int x = 0;
while(x < sizeof Text / sizeof Text[0])
puts(Text[x++]);

// Outra forma
int x = 0;
while(x < sizeof Text / sizeof *Text)
puts(Text[x++]);

// Usando for
for(int x = 0; x < sizeof Text / sizeof Text[0];)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof Text[0]; x++)
puts(Text[x]);

for(int x = 0; x < sizeof Text / sizeof *Text;)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof *Text; x++)
puts(Text[x]);



4. Re: Não consigo varrer um ponteiro :( [RESOLVIDO]

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 07/12/2021 - 22:12h

Heitor.rj escreveu:

ApprenticeX escreveu:
Porque não sei o Tamanho do vetor! Pra saber o tamanho eu teria que pegar via código, mas não sei também usar o sizeof neste caso, ou qualquer outra forma para saber o tamanho.

Use o sizeof assim:
int x = 0;
while(x < sizeof Text / sizeof Text[0])
puts(Text[x++]);

// Outra forma
int x = 0;
while(x < sizeof Text / sizeof *Text)
puts(Text[x++]);

// Usando for
for(int x = 0; x < sizeof Text / sizeof Text[0];)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof Text[0]; x++)
puts(Text[x]);

for(int x = 0; x < sizeof Text / sizeof *Text;)
puts(Text[x++]);

for(int x = 0; x < sizeof Text / sizeof *Text; x++)
puts(Text[x]);

Seu exemplo funcionou para
char *Text[] = {"Text1", "Text2", "Text3"}; 

Mas não consegui aplicar em
int main(int argc, char **argv, char **envp) {
int x = 0;
char *String = envp[x];
Eu achei que teria o mesmo comportamento, mas as variáveis não são a mesma coisa.


5. Re: Não consigo varrer um ponteiro :( [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/12/2021 - 21:45h

Note que a solução apresentada só é válida se o último elemento do array (ou vetor) de ponteiros for um ponteiro nulo.
const char *ap1[]={"abc", "def", "ghi", NULL};
const char *ap2[]={"012", "345", "678"};

for(const char **p=ap1; *p!=NULL; ++p) // OK, pois ap1 usa um ponteiro nulo como marcador de fim.
puts(*p);

for(const char **p=ap2; *p!=NULL; ++p) // PROBLEMA: não existe ponteiro nulo marcando o fim de ap2. Este loop tem comportamento indefinido.
puts(*p);

// Formas alternativas de fazer.
for(intptr_t n=0; n<sizeof ap2/sizeof ap2[0]; ++n) // OK (forma tradicional de conhecer quantos elementos há no array (mas você tem de usar o próprio array na conta; não pode ser um ponteiro para seus elementos).
puts(ap2[n]);

for(intptr_t n=0; n<sizeof ap1/sizeof ap1[0]; ++n)
if(ap1[n]!=NULL) // Necessário para evitar tentar imprimir um ponteiro nulo
puts(ap1[n]);



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts