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' в конце. Хотя, если вы идете персонаж за символом и уверены в своих границах, то это не нужно, но тем не менее рекомендуется.
Игнорируя тот факт, что вы объявляете свой массив переменной (вы должны использовать динамическое распределение или хотя бы константу), char string[lengthOfInt];
должно быть char string[lengthOfInt+1];
и вам нужно string[lengthOfInt] = '\0';
до цикла пока. Строки C заканчиваются на NULL.
Кроме того, почему бы не просто printf("%d", i);
?
Все строки в C должны заканчиваться нулевым байтом (0). Поэтому сначала добавьте 1 к длине массива char, который вы выделяете в стеке, а затем, прежде чем печатать, добавьте нулевой байт в строку.
Я предполагаю, что это домашнее задание. В противном случае вы должны просто использовать itoa
функция.