Странности при подсчёте остатка
Выполнял обычное задание по переворачиванию числа.
#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 шт):
В функции
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;}
Как минимум, вы используете неинициализированную переменную:
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;
}