Verificar conversão de tipo em C/C++
Dica publicada em C/C++ / Miscelânea
Verificar conversão de tipo em C/C++
Pessoal,
Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s
Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
int
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '
Pessoal,
Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s
') {Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
int
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '
Pessoal,
Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s
') {Por muito tempo utilizei a função *atoi* no C para converter uma string em número. Me deparei recentemente com a necessidade de entender números hexadecimais nessas strings, por ventura, ao reler a página de manual do *atoi* e ler a página do *strtoul* e *strtod* me deparei exatamente com o que precisava!
Além disso, a verificação de erro é muito melhor que o *atoi*, que se desse problema ou fosse informado zero tinha que se ter o mesmo comportamento. O exemplo segue em código C++:
int
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '{TEXTO}') {
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
main(void) {
char value[] = "0xDEAD";
char *end = NULL;
double i;
i = strtod(value, &end);
if (i == std::numeric_limits<double>::infinity()
|| i == - std::numeric_limits<double>::infinity()
|| i == std::numeric_limits<double>::quiet_NaN()) {
std::string err("Value `");
err += key + "' not supported";
throw logic_error(err);
}
if (*end != '{TEXTO}') {
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s
std::string err("Value `");
err += key + "' is not not numeric at " + end;
throw logic_error(err);
}
return 0;
}
Os includes do teste são stdexcept e climits. Sem .h como é costume do C++.
[]'s