Преобразование переменной [char] в [int], а затем обратно в [char]
Я использую Visual C 6
Я пытаюсь преобразовать массив символов (одинарные кавычки) в целое число, затем увеличить значение на 1, а затем сохранить результат обратно в другой массив символов..
Но я продолжаю получать неожиданное значение при преобразовании обратно в символ..
Вот мой код
char char_array[4];
char_array[0] = '1';
char_array[1] = '2';
char_array[2] = '3';
char_array[3] = '\0'; //Terminating character
int my_number = atoi(char_array);
printf("my_number = %d" , my_number); // output is 123
my_number++; // works and my_number is incremented =124
printf("now: my_number = %d" , my_number); // output is 124
char result[4]; //declared to store the result
result = itoa(my_number); // Output is unexpected.
printf("%c", result[0]); // Output is 2 instead of 1
printf("%c", result[1]); // Output is 2
printf("%c", result[2]); // Output as 3 instead of 4
Кажется, что функция itoa()
как-то знает первоначальное значение 123
и каким-то странным образом знает, что я увеличил это значение... но сложение сделано с неправильной цифрой. Вместо добавления 1 к младшей значащей цифре, добавление делается к самой значимой цифре.
4 ответа
Мне действительно трудно поверить, что ваш компилятор пропускает этот код:
char result[4]; //declared to store the result
result = itoa(my_number); // Output is unexpected.
По одной причине вы пытаетесь переустановить массив. Что не должно быть разрешено. Для другого, itoa()
обычно принимает три аргумента. Его прототип должен выглядеть так:
char *itoa(int value, char * str, int base);
Так что вы должны называть это так:
char result[4];
itoa(my_number, result, 10);
Или, если вы хотите использовать переносимые функции, которые не имеют возможных переполнений буфера:
char result[4];
snprintf(result, 4, "%d", my_number);
itoa
не является стандартной библиотечной функцией C.
Ты можешь использовать
char result[sizeof(int) * CHAR_BIT / 10 * 3 + 4]; // '-1', '\0', max sizeof int on my 4 byte machine
// 10 bits are roughly equal to 3 digits at decimal base, extra 4 for '-', '\0', extra digit and safe character
sprintf(result, "%d", my_number);
Если вы все еще хотите использовать itoa
обратитесь к документации по этой функции (в документации библиотеки / компилятора)
my_number увеличивается и, следовательно, если вы используете itoa()
тогда он будет знать новое значение my_number, равное 124.
Проверьте код ниже:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char char_array[4];
char_array[0] = '1';
char_array[1] = '2';
char_array[2] = '3';
char_array[3] = '\0'; //Terminating character
int my_number = atoi(char_array);
printf("my_number = %d" , my_number); // output is 123
my_number++; // works and my_number is incremented =124
printf("now: my_number = %d" , my_number); // output is 124
char result[4]; //declared to store the result
snprintf(result,4,"%d",my_number);
printf("%c", result[0]);
printf("%c", result[1]);
printf("%c", result[2]);
return 0;
}
Во-первых, itoa(my_number) может быть неправильным, я знаю только следующую функцию:
char * itoa ( int value, char * str, int base );
str должен быть массивом, достаточно длинным, чтобы содержать любое возможное значение: (sizeof(int)*8+1) для radix=2, т.е. 17 байтов на 16-битных платформах и 33 на 32-битных платформах.