Conectar

View Full Version : |Dúvida| C++, Função strcpy_s



embreve
11-14-2024, 12:28 AM
Boa noite a todos.
Para os mais experientes , poderia me tirar uma duvida?
Estou copiando do meu arquivo .txt uma String com o nome Diamante I com a função str_cpy_s, mais ela só está copiando o primeiro nome que seria Diamante.
Está ignorando o espaço e o restante da String.

Alguém pra me ajudar a corrigir?
Muito obrigado.

Ravoc
11-16-2024, 08:05 PM
poste um trecho do código onde você está utilizando strcpy_s para que possamos analisar melhor.

embreve
11-16-2024, 10:39 PM
poste um trecho do código onde você está utilizando strcpy_s para que possamos analisar melhor.

Opa!
strcpy_s(this->PatentStruct[this->_Count].NamePatente, sizeof(this->PatentStruct[this->_Count].NamePatente), (Section.Rows[i].GetStringPtr(2)));

Segredo
11-17-2024, 09:13 AM
Opa!
strcpy_s(this->PatentStruct[this->_Count].NamePatente, sizeof(this->PatentStruct[this->_Count].NamePatente), (Section.Rows[i].GetStringPtr(2)));

NamePatente - procure por isto, nele vai estar declarado qual tipo de variavel ela está (muito provavelmente seja do tipo char, veja qual o tamanho desse array imposto nela: quando falo tamanho é: char NamePatent[50] (50 seria seu tamanho)]

embreve
11-17-2024, 06:35 PM
NamePatente - procure por isto, nele vai estar declarado qual tipo de variavel ela está (muito provavelmente seja do tipo char, veja qual o tamanho desse array imposto nela: quando falo tamanho é: char NamePatent[50] (50 seria seu tamanho)]

O tamanho está ok! O problema é na função mesmo. Como eu disse: a função não copia o espaço em branco e restante do nome. Fiz o teste usando _ ex: Diamante_I copiou todo o nome. Usando Diamant I com espaço, a função só puxa o primeiro nome o espaço e o I são ignorado. Espero que conseguido explicar.

Ravoc
11-17-2024, 07:21 PM
Tente usar uma função alternativa de cópia, como strncpy_s, para ver se o comportamento muda

const char* tempStr = Section.Rows[i].GetStringPtr(2);size_t length = strlen(tempStr);

strncpy_s(this->PatentStruct[this->_Count].NamePatente, sizeof(this->PatentStruct[this->_Count].NamePatente), tempStr, _TRUNCATE);

embreve
11-17-2024, 09:32 PM
Tente usar uma função alternativa de cópia, como strncpy_s, para ver se o comportamento muda

const char* tempStr = Section.Rows[i].GetStringPtr(2);size_t length = strlen(tempStr);

strncpy_s(this->PatentStruct[this->_Count].NamePatente, sizeof(this->PatentStruct[this->_Count].NamePatente), tempStr, _TRUNCATE);

Obrigado, Ravoc. Irei testar.

Romário
11-17-2024, 10:41 PM
Olá... Primeiro que essa função não é do C++, ela é de C e é uma alternativa segura a strcpy. Talvez se vc usar strcpy resolva o seu problema, mas existem outros métodos e funções melhores para fazer isso e evitar problemas de vazamento de memória.

embreve
11-18-2024, 10:34 AM
Olá... Primeiro que essa função não é do C++, ela é de C e é uma alternativa segura a strcpy. Talvez se vc usar strcpy resolva o seu problema, mas existem outros métodos e funções melhores para fazer isso e evitar problemas de vazamento de memória.

Sim, é do C. Preciso passar três parâmetros para a função, no caso essa aceita apenas duas.
Sabe me dizer quais seriam essas funções melhores para que eu possa corrigir o meu problema? Se possível hoje irei tentar resolver utilizando a ajuda do amigo, Ravoc.
Obrigado pelo seu comentário.

3 Horas 47 minutes:------- Atualizado -------


Tente usar uma função alternativa de cópia, como strncpy_s, para ver se o comportamento muda

const char* tempStr = Section.Rows[i].GetStringPtr(2);size_t length = strlen(tempStr);

strncpy_s(this->PatentStruct[this->_Count].NamePatente, sizeof(this->PatentStruct[this->_Count].NamePatente), tempStr, _TRUNCATE);

Infelizmente testei aqui, e continua com o mesmo comportamento.

4 minutes:------- Atualizado -------


Olá... Primeiro que essa função não é do C++, ela é de C e é uma alternativa segura a strcpy. Talvez se vc usar strcpy resolva o seu problema, mas existem outros métodos e funções melhores para fazer isso e evitar problemas de vazamento de memória.

Utilizei a função strcpy e também não funcionou.

Ravoc
11-18-2024, 02:36 PM
Que estranho, faça o seguinte, me encaminhe o script aqui no tópico para analisarmos ele completamente, creio eu que você utilizando OGOCX LUA?

embreve
11-18-2024, 03:04 PM
Que estranho, faça o seguinte, me encaminhe o script aqui no tópico para analisarmos ele completamente, creio eu que você utilizando OGOCX LUA?

Não! Estou trabalhando com Plugin. 99.60T.

strcpy_s(this->PatentStruct[this->_Count].NamePatent, sizeof(this->PatentStruct[this->_Count].NamePatent), (Section.Rows[i].GetStringPtr(2)));

void cPatent::HandlePatentCommand(int aIndex)
{
int RankIndex = this->GetRankIndex(aIndex);


if (RankIndex == -1)
{
Function.MsgUser(aIndex, 1, "| Você não possui uma Patent.");
return;
}


CUSTOM_RANKUSER_DATA CurrentPatent = this->PatentStruct[RankIndex];


bool isMaxPatent = (CurrentPatent.Max == -1);


if (isMaxPatent)
{
Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Você já atingiu a Patent máxima.", CurrentPatent.NamePatent);
}
else
{
CUSTOM_RANKUSER_DATA nextPatent = this->PatentStruct[RankIndex + 1];
int PointsNeeded = nextPatent.Min - Custom[aIndex].Patent;


Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);


Function.MsgUser(aIndex, 1, "| Próxima Patent: %s", nextPatent.NamePatent);


Function.MsgUser(aIndex, 1, "| Pontos Necessários: %d.", PointsNeeded);
}
}

Ravoc
11-18-2024, 05:04 PM
Agora, quando você processar uma string como "Diamante I", ela será copiada inteira, incluindo o espaço e o "I". Além disso, se algo der errado com a string de origem, o código não quebra e coloca um valor padrão.



const char* sourceString = Section.Rows[i].GetStringPtr(2);

if (sourceString != nullptr && strlen(sourceString) > 0) {
strncpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
sourceString,
_TRUNCATE);
} else {
strcpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
"Desconhecida");
}


void cPatent::HandlePatentCommand(int aIndex)
{
int RankIndex = this->GetRankIndex(aIndex);


if (RankIndex == -1)
{
Function.MsgUser(aIndex, 1, "| Você não possui uma Patent.");
return;
}


CUSTOM_RANKUSER_DATA CurrentPatent = this->PatentStruct[RankIndex];


bool isMaxPatent = (CurrentPatent.Max == -1);


if (isMaxPatent)
{
Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Você já atingiu a Patent máxima.");
}
else
{
CUSTOM_RANKUSER_DATA nextPatent = this->PatentStruct[RankIndex + 1];
int PointsNeeded = nextPatent.Min - Custom[aIndex].Patent;


Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Próxima Patent: %s", nextPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Pontos Necessários: %d.", PointsNeeded);
}
}

embreve
11-18-2024, 07:57 PM
Agora, quando você processar uma string como "Diamante I", ela será copiada inteira, incluindo o espaço e o "I". Além disso, se algo der errado com a string de origem, o código não quebra e coloca um valor padrão.



const char* sourceString = Section.Rows[i].GetStringPtr(2);

if (sourceString != nullptr && strlen(sourceString) > 0) {
strncpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
sourceString,
_TRUNCATE);
} else {
strcpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
"Desconhecida");
}


void cPatent::HandlePatentCommand(int aIndex)
{
int RankIndex = this->GetRankIndex(aIndex);


if (RankIndex == -1)
{
Function.MsgUser(aIndex, 1, "| Você não possui uma Patent.");
return;
}


CUSTOM_RANKUSER_DATA CurrentPatent = this->PatentStruct[RankIndex];


bool isMaxPatent = (CurrentPatent.Max == -1);


if (isMaxPatent)
{
Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Você já atingiu a Patent máxima.");
}
else
{
CUSTOM_RANKUSER_DATA nextPatent = this->PatentStruct[RankIndex + 1];
int PointsNeeded = nextPatent.Min - Custom[aIndex].Patent;


Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Próxima Patent: %s", nextPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Pontos Necessários: %d.", PointsNeeded);
}
}




Muito obrigado pela sua contribuição! Assim que eu chegar do trabalho irei testar e retornar o feedback.

1 32 minutes:------- Atualizado -------


Agora, quando você processar uma string como "Diamante I", ela será copiada inteira, incluindo o espaço e o "I". Além disso, se algo der errado com a string de origem, o código não quebra e coloca um valor padrão.



const char* sourceString = Section.Rows[i].GetStringPtr(2);

if (sourceString != nullptr && strlen(sourceString) > 0) {
strncpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
sourceString,
_TRUNCATE);
} else {
strcpy_s(this->PatentStruct[this->_Count].NamePatent,
sizeof(this->PatentStruct[this->_Count].NamePatent),
"Desconhecida");
}


void cPatent::HandlePatentCommand(int aIndex)
{
int RankIndex = this->GetRankIndex(aIndex);


if (RankIndex == -1)
{
Function.MsgUser(aIndex, 1, "| Você não possui uma Patent.");
return;
}


CUSTOM_RANKUSER_DATA CurrentPatent = this->PatentStruct[RankIndex];


bool isMaxPatent = (CurrentPatent.Max == -1);


if (isMaxPatent)
{
Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Você já atingiu a Patent máxima.");
}
else
{
CUSTOM_RANKUSER_DATA nextPatent = this->PatentStruct[RankIndex + 1];
int PointsNeeded = nextPatent.Min - Custom[aIndex].Patent;


Function.MsgUser(aIndex, 1, "| Patent Atual: %s", CurrentPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Próxima Patent: %s", nextPatent.NamePatent);
Function.MsgUser(aIndex, 1, "| Pontos Necessários: %d.", PointsNeeded);
}
}




Ravoc, o problema persiste! Que estranho... Mais eu te agradeço pelo seu tempo de ensino! Vou continuar quebrando a cabeça... Preciso corrigir isso.

Ravoc
11-19-2024, 12:27 AM
Vish, consegue preparar um log mais detalhado?

embreve
11-19-2024, 08:08 PM
Vish, consegue preparar um log mais detalhado?

Boa tarde, Ravoc.
Estou apenas me aventurando em C++, como eu faria esse Log para lhe enviar?

Ravoc
11-20-2024, 06:10 PM
Boa tarde, Ravoc.
Estou apenas me aventurando em C++, como eu faria esse Log para lhe enviar?

Poste algum print onde o erro é executado, pois é estranho com a solução acima era pra ter anulado os erros, caso houvesse erro ele jogava um valor padrão para testes

embreve
11-21-2024, 03:38 PM
Poste algum print onde o erro é executado, pois é estranho com a solução acima era pra ter anulado os erros, caso houvesse erro ele jogava um valor padrão para testes

Boa tarde, Ravoc.
Meu código não apresenta erro algum. Apenas não copia o espaço e o restante da string.

Abraço.