Perdido, Tentando converter ponteiro para strcat [RESOLVIDO]

1. Perdido, Tentando converter ponteiro para strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 17/11/2021 - 14:38h

Boa Tarde a todos,
Estou muito perdido tentando fazer isso funcionar

Tenho uma variável antes e o Loop abaixo onde leio um arquivo character by character
char Reg[20];
for(int Ch; (Ch = getc(MyFile)) != EOF;) {

Não sei o porque da variável int Ch se torna um ponteiro! Ao menos foi isso que entendi!
Mesmo trocando int Ch por char Ch dá no mesmo!

Quero alimentar o strcat assim. A cada passagem ele cai colocar 1 letra na variável Reg finalizando ela
strcat(Reg, Ch);

// Não quero fazer assim, porque teria que mudar muita coisa pra implementar isso no meu código, pois não será fácil incluir um x(contador) para cada variável diferente existente. Motivo pela escolha do strcat que encerra a variável, liberando-a para outras funções dentro do Loop
// Test[x] = Reg[x];

Em C++ funciona assim: Reg += Ch;

Eu não sei fazer essa conversão, até tentei isso abaixo sem sucesso:
strcat(Reg, (char)Ch);
strcat(Reg, (char*)Ch); // error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]

Erros do Compilador:
error: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
100 | strcat(Reg, Ch);
| ^~~~~~~~~
| |
| int

error: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
100 | strcat(Reg, Ch);
| ^~~~~~~~~
| |
| char

Alguém tem alguma idéia?


  


2. MELHOR RESPOSTA

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 17/11/2021 - 20:20h

ApprenticeX escreveu:
Eu não sei fazer essa conversão, até tentei isso abaixo sem sucesso:
strcat(Reg, (char)Ch);
strcat(Reg, (char*)Ch); // error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
Alguém tem alguma idéia?

A solução abaixo vai funcionar perfeitamente:
strcat(Reg, (char[2]){Ch, '\0'}); 


3. Re: Perdido, Tentando converter ponteiro para strcat [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 17/11/2021 - 17:41h

strcat espera que você passe outra string como argumento para poder concatenar com a string a esquerda.
Só que o seguinte, é preciso que a string que vai receber a outtra consiga caber os chars da outra string:
char str[32] = "aqui é uma string < 32";//string de 32 bytes + o caractere nulo
printf("str antes = %s\n", str);
strcat(str, "esta é uma string um pouco maior e vai causar erro");
printf("str depois = %s\n", str);

O erro na execução do strcat acontece por conta do tamanho de str não caber todos os caracteres da frase e por isso, vai dar algo como stack smashing.
Falo disso porque caso você continue concatenando algo ao final da str ele pode crescer tanto que pode passar o tamanho pre-definido.

Vou lhe dizer como concatenar um único caractere para o fim da string:
use strncat
Exemplo:

//inclua o string.h
char str[32] = "metal slug";
char ch = 'X';
strncat(str, &ch, 1);
printf("str = %s\n", str);

//isso acima significa: pegue str, pegue o endereço do caractere ch, e aplique apenas 1 caractere a frente do endereço de ch.
Se você colocar algo como: strncat(str, &ch, 23), então, a função strncat irá tentar copiar a partir do endereço de ch, mais 23 caracteres, o que pode render um baita bug no seu programa.

Observe que o &ch na verdade é porque a função strncat recebe um ponteiro. Sendo assim, você pode colocar outra string e copiar somente mais uns caracteres:
Teste o código abaixo:

//inclua o string.h
char str[64] = "Metal Slug: ";
char title[] = "Super Vehicle 0001";
printf("str = %s\n", str);
strncat(str, title, 5);
printf("str = %s\n", str);
//brincando um pouco mais, alô ponteiro!
strncat(str, title + 14, 4);
printf("str = %s\n", str);



4. Re: Perdido, Tentando converter ponteiro para strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 17/11/2021 - 20:29h

Obrigado SamL por responder!

SamL escreveu:
strcat espera que você passe outra string como argumento para poder concatenar com a string a esquerda.
Só que o seguinte, é preciso que a string que vai receber a outtra consiga caber os chars da outra string:
char str[32] = "aqui é uma string < 32";//string de 32 bytes + o caractere nulo
printf("str antes = %s\n", str);
strcat(str, "esta é uma string um pouco maior e vai causar erro");
printf("str depois = %s\n", str);
O erro na execução do strcat acontece por conta do tamanho de str não caber todos os caracteres da frase e por isso, vai dar algo como stack smashing.
Falo disso porque caso você continue concatenando algo ao final da str ele pode crescer tanto que pode passar o tamanho pre-definido.

No meu caso SamL ela não tem como passar o tamanho porque ela conta até seu tamanho, no caso 19 Caracteres para uso, e o último com terminador.
Este é o texto máximo que ela recebe: 00/00/0000 00:00:00
Mas entendi o que vc tentou explicar, apenas não seria o caso mesmo dela passar de tamanho no Loop!
O Problema ocorre porque o strcat quer uma string, e eu estou tentando enviar 1 caracter apenas que não é uma string, pois não tem um terminador, e ele acaba apenas sendo um valor decimal




5. Re: Perdido, Tentando converter ponteiro para strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 17/11/2021 - 20:31h

Heitor.rj escreveu:
ApprenticeX escreveu:
Eu não sei fazer essa conversão, até tentei isso abaixo sem sucesso:
strcat(Reg, (char)Ch);
strcat(Reg, (char*)Ch); // error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
Alguém tem alguma idéia?

A solução abaixo vai funcionar perfeitamente:
strcat(Reg, (char[2]){Ch, '\0'}); 

Não sabia dessa solução, tipo converter Ch para uma String sem criar uma variável extra!
Sim isso funcionou!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts