Eu preciso usar um std::string
para armazenar dados recuperados por fgets()
. Para fazer isso, preciso converter o char*
valor de retorno defgets()
em std::string
para armazenar em uma matriz. Como isso pode ser feito?
262
std::string
tem um construtor para isso:
const char *s = "Hello, World!";
std::string str(s);
Observe que essa construção copia profundamente a lista de caracteres em s
e s
não deve ser nullptr
, ou o comportamento é indefinido.
str
é apenas um nome de variável. Poderia ser qualquer coisa:S
,abc
,l
,I
,strHelloWorld
. Obviamente, algumas opções são melhores que outras. Mas para este exemplostr
é bastante aceitável.Se você já sabe o tamanho do caractere *, use-o
Isso não usa strlen.
EDIT: Se a variável de string já existir, use assign ():
fonte
A maioria das respostas fala sobre a construção
std::string
.Se já estiver construído, basta usar o operador de atribuição .
fonte
Por que usar
fgets()
quando você está programando C ++? Por que nãostd::getline()
?fonte
Passe-o pelo construtor:
Você pode usar a função string.c_str () para o contrário:
fonte
c_str()
retornaconst char*
fonte
fonte
Gostaria de mencionar um novo método que usa o literal definido pelo usuário
s
. Isso não é novo, mas será mais comum porque foi adicionado na Biblioteca Padrão C ++ 14.Em grande parte supérfluo no caso geral:
Mas permite que você use auto, também com amplas strings:
E aqui é onde realmente brilha:
fonte
Acabei de lutar com o MSVC2005 para usar o
std::string(char*)
construtor exatamente como a resposta mais bem avaliada. Como vejo essa variante listada como nº 4 em http://en.cppreference.com/w/cpp/string/basic_string/basic_string sempre confiável , acho que até um compilador antigo oferece isso.Levei tanto tempo para perceber que esse construtor se recusa a combinar
(unsigned char*)
como argumento! Recebi essas mensagens de erro incompreensíveis sobre falha na correspondência com ostd::string
tipo de argumento, o que definitivamente não era o que eu pretendia. Acabar de lançar o argumentostd::string((char*)ucharPtr)
resolveu meu problema ... duh!fonte
fonte
data
permanece não inicializado (vazio).Não sei por que ninguém além de Erik mencionou isso, mas de acordo com esta página , o operador de atribuição funciona bem. Não há necessidade de usar um construtor, .assign () ou .append ().
fonte
=
(e+=
). Não parece acontecer com literais como este, mas apenas com aschar*
coisas. A questão de saber se esses relatórios são realmente vazamentos é discutida aqui . Mas se eu alterasse a atribuição paradestString = std::string(srcCharPtr);
os relatórios de vazamento da valgrind, eles desapareceriam. YMMV.Constructs an object of class basic_string and determines its initial string value from the array
. Diz valor e nada sobre buffers ou propriedade do ponteiro.