C печать строки приводит к странным символам

Я пытаюсь вывести int следующим образом:

void the_int(int i)
{
     int lenghtOfInt = 0;
     int tempValue = i;
     while(tempValue >= 1)
     {
          tempValue/=10;
          lenghtOfInt++;
     }

     int currentDigit;
     char string[lengthOfInt];
     while(i>9)
     {
           currentDigit= i % 10;
           i = i/10;
           char ch = (char)(((int)'0')+currentDigit);

           string[lengthOfInt--] = ch;
     }
     string[lengthOfInt]= (char)(((int)'0')+i);
     function(str); //prints the string character by character
}

если я попробую эту функцию с i = 12, я получу а12ç. Что я делаю неправильно?

4 ответа

Решение

Вы получаете доступ за пределами массива в следующей строке.

string[lengthOfInt--] = ch;

Это пытается получить доступ к индексу lengthofInt что неверно.

Теперь, игнорируя объявление массива с переменной,

char string[lengthOfInt];

объявляет массив, имеющий индексы из 0 в lengthofInt - 1

Кроме того, в зависимости от того, как вы печатаете вашу строку, вам может понадобиться символ '\0' в конце. Хотя, если вы идете персонаж за символом и уверены в своих границах, то это не нужно, но тем не менее рекомендуется.

Присоединяйтесь к 21-му веку и используйте std::string,

Игнорируя тот факт, что вы объявляете свой массив переменной (вы должны использовать динамическое распределение или хотя бы константу), char string[lengthOfInt]; должно быть char string[lengthOfInt+1]; и вам нужно string[lengthOfInt] = '\0'; до цикла пока. Строки C заканчиваются на NULL.

Кроме того, почему бы не просто printf("%d", i);?

Все строки в C должны заканчиваться нулевым байтом (0). Поэтому сначала добавьте 1 к длине массива char, который вы выделяете в стеке, а затем, прежде чем печатать, добавьте нулевой байт в строку.

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

Другие вопросы по тегам