2014-12-11 7 views
-5

Я использую Visual C 6Преобразование [символов] переменную [Int], а затем обратно в [символ]

Я пытаюсь преобразовать массив символов (одной кавычки) в целое число, то приращением значение 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 к наименее значащей цифре добавление производится до самой значащей цифры.

+1

У вас есть размер 3 массива, и вы притворяетесь, что он имеет размер 4. – juanchopanza

+2

** - 1 ** не настоящий код. напримерневерное количество аргументов в 'itoa', попытка переустановки массива. –

ответ

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); 
+1

... или использовать стандартную функцию 'snprintf (результат, 4,"% d ", my_number)'. – user694733

+0

@ user694733: Это абсолютно необходимо включить в ответ. Благодаря! –

2

itoa является не стандартной функции библиотеки С.

Вы можете использовать

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, обратитесь к документации этой функции (в библиотеке документации/компилятора)

+0

Вы имели в виду 'snprintf' вместо' sprintf'? – Ahmad

+0

Нет. Я имею в виду 'sprintf'. Вы можете использовать snprintf, когда размер буфера ограничен. –

1

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; 
} 
0

Сначала itoa (my_number), может быть неправильно, я знаю только следуют функции:

char * itoa (int value, char * str, int base); 

ул должен быть массив достаточно долго, чтобы содержать любое возможное значение: (SizeOf (INT) * 8 +1) для radix = 2, т.е. 17 байт в 16-разрядных платформах и 33 в 32-битных платформах.