atol (), atof (), atoi () функции поведения, есть ли стабильный способ конвертировать из / в строку / целое число? - PullRequest
2 голосов
/ 17 мая 2010

В эти дни я играю с функциями C atol (), atof () и atoi () , из блога я нахожу учебное пособие и применил:

Вот мои результаты:

void main()
{
    char a[10],b[10];
    puts("Enter the value of a");
    gets(a);
    puts("Enter the value of b");
    gets(b);
    printf("%s+%s=%ld and %s-%s=%ld",a,b,(atol(a)+atol(b)),a,b,(atol(a)-atol(b)));
    getch();
}

Существует atof(), который возвращает значение с плавающей запятой строки, и atoi(), который возвращает целочисленное значение.

Теперь, чтобы увидеть разницу между 3, я проверил этот код:

main()
{
    char a[]={"2545.965"};
    printf("atol=%ld\t atof=%f\t atoi=%d\t\n",atol(a),atof(a),atoi(a));
}

Вывод будет

atol=2545 atof=2545.965000 atoi=2545

char a[]={“heyyou”};

Теперь, когда вы запустите программу, будет выводиться следующее ( почему? , есть ли решение для преобразования чистых строк в целое число?)

atol=0 atof=0 atoi=0

Строка должна содержать числовое значение. Теперь измените эту программу как

char a[]={“007hey”};

Вывод в этом случае (протестирован в Red Hat Linux) будет

atol=7 atof=7.000000 atoi=7

поэтому функции заняли только 007, а не оставшуюся часть ( почему? ).

Теперь рассмотрим это

char a[]={“hey007?};

Вывод программы будет

atol=0 atof=0.000000 atoi=0

Так что я просто хочу преобразовать мои строки в числа, а затем снова в тот же текст. Я играл с этими функциями, и, как вы видите, я получаю действительно интересные результаты.

Почему это?

Существуют ли другие функции для преобразования из / в строку / целое число и наоборот?

EDIT:

Так что в качестве входных данных, если я возьму несколько имен или что-то еще, я преобразую их в целые числа / числа с плавающей запятой ... затем применю некоторые другие функции.

Также мне любопытно, буду ли я использовать тот же вывод с теми же входами, когда использую какие-либо ваши предложения?

Ответы [ 4 ]

6 голосов
/ 17 мая 2010

Высшим решением этой проблемы, учитывая, что вы также добавили тег C ++, является использование Boost lexical_cast .

3 голосов
/ 17 мая 2010

Вы можете использовать strtol() и strtod(), которые намного превосходят atol() и atof(), поскольку они позволяют вам проверить, успешно ли выполнено преобразование. ato_() функции завершаются сбоем молча, как вы видели, когда пытались конвертировать "heyyou".

3 голосов
/ 17 мая 2010

Нет несоответствий как таковых:

  • atoi парсит до int
  • atof парсит до float
  • atol разбирает до long
  • Все три анализируют префикс строки, пока она не достигнет конца, или недопустимый символ
    • Остальная часть строки (если есть) игнорируется

Так что я просто хочу преобразовать мои строки в число, а затем снова в тот же текст

То есть число не должно быть понятным толкованием строки? И сколько может быть длина строки и насколько большими могут быть числа?

Строка может быть декодирована как byte[]. Это достаточно хорошо?

Возможно, вам нужно что-то вроде криптографии с открытым ключом ?

2 голосов
/ 17 мая 2010

Похоже, вы хотите создать биективное отображение между произвольными символьными строками и действительными числами.

Это не то, для чего предназначены функции atol(), atoi() и atof() - они предназначены для преобразования подмножества строк, представляющих числа в базе 10, в соответствующие long, int или float значение (если возможно).

Нет встроенной функции для создания биективного отображения, к которому вы стремитесь, особенно потому, что вы на самом деле не указали, как вы хотите, чтобы отображение работало. Конечно, позволяет написать такую ​​функцию отображения на языке C. Самый простой способ - просто обработать строку как последовательность цифр в числе из 255-го числа (значение 256-го символа, '\0'). не может быть частью строки C), причем N наименее значащих цифр представляют длину строки (где N выбирается в соответствии с вашими требованиями). Обратите внимание, что если вы хотите сделать это со строками произвольной длины, вам нужно работать с библиотекой "Big Integer" (например, GMP или BigNum в OpenSSL) - самый длинный тип в стандарте C, "long long" не может быть отображен один к одному для набора строк C, которые содержат строки длиной более 8 символов, поскольку его гарантированный диапазон включает только 18 446 744 073 709 551 615 уникальных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...