Странности при подсчёте остатка

Выполнял обычное задание по переворачиванию числа.

#include <math.h>
int getInt() {int n; scanf("%i", &n); return n;}
int intLength(int n) {int result; while (n != 0) {result += 1; n /= 10;} return result;}
int reverseInt(int n) {
    int result = 0;
    while (n != 0) {
        result += (n % 10) * (pow(10, intLength(n) - 1));
        n /= 10;
    }
    return result;
}
int main() {printf("%i\n", reverseInt(getInt()));}

При вводе "123" получил на выходе "120300". Естественно, пошёл искать ошибку с помощью вывода промежуточных результатов:

...
while (n != 0) {
        printf("%i\n", n % 10);
        result += (n % 10) * (pow(10, intLength(n) - 1));
...

То же число "123", вывод:
3
2
1
321
В ходе опытов получил, что можно даже не выводить промежуточный результат (printf("", n % 10)).
Вопрос: в чём заключается ошибка? Это связано с памятью? Можно ли обойтись без вывода на экран?


Ответы (2 шт):

Автор решения: AlexGlebe

В функции

int intLength(int n) {int result; while (n != 0) {result += 1; n /= 10;} return result;}

происходит неопределённое поведение программы из-за того, что вы переменную result не инициализировали (не дали начальное значение). А тогда начальным значением может быть случайное значение (мусор памяти).

Решение :

int intLength(int n) {

  int result = 0;

  while (n != 0) {result += 1; n /= 10;} 
  return result;}
→ Ссылка
Автор решения: Harry

Как минимум, вы используете неинициализированную переменную:

int intLength(int n)
{
    int result;

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

Но эта функция вам совсем не нужна! Все работает куда проще:

int reverseInt(int n)
{
    int result = 0;
    while (n != 0) {
        result = result*10 + n%10;
        n /= 10;
    }
    return result;
}
→ Ссылка