Estou trabalhando em uma tarefa e, como parte dela, preciso extrair o número inteiro de uma string.
Eu tentei usar a atoi()
função, mas ela sempre retorna a 0
, então mudei para strtol()
, mas ainda retorna a 0
.
O objetivo é extrair os números inteiros da string e passá-los como argumentos para uma função diferente. Estou usando uma função que usa esses valores para atualizar alguns dados ( update_stats
).
Lembre-se de que eu sou bastante novo em programação na linguagem C, mas essa foi minha tentativa:
void get_number (char str[]) {
char *end;
int num;
num = strtol(str, &end, 10);
update_stats(num);
num = strtol(end, &end, 10);
update_stats(num);
}
O objetivo disso é em uma string "e5 d8"
(por exemplo), eu extrairia oe 5
a 8
partir dessa string.
O formato da string é sempre o mesmo.
Como posso fazer isso?
c
string-parsing
Ramux05
fonte
fonte
isdigit
antes de usarstrtol
atoi
estrtol
esperam receber o ponteiro para o primeiro caractere de um numeral - seu ponteiro já deve estar apontando para um dígito. Nem "e" nem "d" são um dígito quando a base é 10. Para encontrar os números na sequência, você deve escrever um código para examinar cada caractere para determinar se é um dígito ou não. Depois de encontrar um dígito, você pode convertê-lo (apenas um dígito) ou a sequência de dígitos (vários dígitos) para um número, dependendo da sua necessidade."e5 d8"
tostrtol
não é uma maneira correta de encontrar o “5” e convertê-lo em um número.Respostas:
strtol
não encontra um número em uma string. Ele converte o número no início da string . (Ignora o espaço em branco, mas nada mais.)Se você precisar descobrir onde um número começa, use algo como:
(
man strpbrk
)Se seus números puderem ser assinados, você precisará de algo um pouco mais sofisticado. Uma maneira é fazer o acima e fazer backup de um caractere se o caractere anterior for
-
. Mas cuidado com o início da string:Apenas colocar
-
ostrpbrk
argumento produziria correspondências falsas em entradas comonon-numeric7
.fonte
Se o formato é sempre assim, isso também pode funcionar
Resultado
%[^0-9]
corresponderá a qualquer caractere que não seja um dígito. Ao adicionar o*
mesmo, isso%*[^0-9]
indica que os dados devem ser lidos a partir da string, mas ignorados.fonte
sscanf
. Eu realmente aprecio o esforço. No entanto, em nenhum lugar é especificado que o formato seja o caminho que você tomou como garantido. Tente adicionar um pouco mais de generosidade, se puder. Além disso, se o usuário estiver preso na E / S e na conversão de string para inteiro, há uma alta probabilidade de que ele seja novo. Portanto, seria realmente útil adicionar ou pelo menos fornecer um link para a documentação, por exemplo, neste casosscanf
,. Boa resposta embora :)sscanf
é a documentação. Eu acho que o que realmente é o melhoramento aqui é pouca explicação do formato, que posso acrescentar aqui.Eu sugiro que você escreva a lógica por conta própria. Eu sei, é como reinventar a roda , mas nesse caso, você terá uma ideia de como as funções da biblioteca realmente funcionam.
Aqui está uma função que proponho:
Não se esqueça de passar uma string com a
\0
no final :)fonte
c
, você pode converter bool para inttrue
efalse
para1
e0
respectivamente