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.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.