Предполагая, что у нас есть такой ввод,
12cx7,23: 55: 00,0.968900025,, 0,74,0,2,
И мы бы хотели,
"Возникли проблемы с преобразованием строк в удвоения."
То есть мы хотели бы отделить буквенно-цифровые данные. А затем оставшиеся целые числа и числа с плавающей запятой, мы хотели бы напечатать в правильном формате, я бы сделал что-то вроде следующего:
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int isNumeric (const char * s)
{
if (s == NULL || *s == '\0' || isspace(*s)) {
return 0;
}
char * p;
strtod (s, &p);
return *p == '\0';
}
bool isInteger(double val)
{
int truncated = (int)val;
return (val == truncated);
}
int main() {
// If this is your input:
char input[100] = "12cx7,23:55:00,0.968900025,0,74,0,2,";
// Then step 1 -> we split the values
char *token = std::strtok(input, ",");
while (token != NULL) {
// Step 2 -> we check if the values in the string are numeric or otherwise
if (isNumeric(token)) {
// printf("%s\n", token);
char* endptr;
double v = strtod(token, &endptr);
// Step 3 -> we convert the strings containing no fractional parts to ints
if (isInteger(v)) {
int i = strtol(token, &endptr, 10);
printf("%d\n", i);
} else {
// Step 4 -> we print the remaining numeric-strings as floats
printf("%f\n", v);
}
}
else {
// What is not numeric, print as it is, like a string
printf("%s,",token);
}
token = std::strtok(NULL, ",");
}
}
Для функции isInteger()
я взял идею / код из этого принятого ответа. Все остальное довольно оригинально и, вероятно, может быть улучшено / улучшено.
Затем выдается такой вывод:
12cx7,23: 55: 00,0.968900,0,74,0,2,
Это в основном вывод, который нам нужен, за исключением очень важного различия в том, что на входе была целая строка, а на выходе получаются двойные / плавающие числа, целые числа и строки, правильно идентифицированные и напечатанные с правильным форматированием.
EDIT
Я не занимаюсь обработкой ошибок здесь. Этот код просто для того, чтобы дать ОП подтверждение концепции. Проверять и контролировать любые ошибки, возвращаемые используемыми функциями strtoX
.