我正在尝试用 C 编写一个程序,该程序可以读取最多 20 位的正整数。它应该输出大于输入的最小回文数。回文数是指数字颠倒时相同的数(例如,98789 是回文数,12344321 是回文数,12345 不是回文数,因为颠倒后变为 54321)。例如,示例运行将 17 作为输入和输出 22。但是,当我运行程序并放置输入时,会出现分段错误:11 错误。请注意,我不是一个有经验的程序员,所以代码可能看起来很丑:
#include <stdio.h>
unsigned long reversed(unsigned long palindrome);
int main() {
unsigned long palindrome;
scanf("%lu", &palindrome);
while(1) {
palindrome++;
if (palindrome == reversed(palindrome)) {
printf("%lu", reversed(palindrome));
break;
}
}
}
unsigned long reversed(unsigned long palindrome) {
int size = 0;
unsigned long copy = palindrome;
while(copy != 0) {
copy /= 10;
size++;
}
int count = 0;
unsigned long arr[size];
while (palindrome != 0) {
arr[count] = palindrome % 10;
count++;
}
unsigned long reverse = 0;
for (int i = 0; i < size; i++) {
reverse *= 10;
reverse += arr[i];
}
return reverse;
}
该错误似乎表明我正在访问一个我不应该访问的内存位置,但我不明白其实际原因。它与无符号长整数或数组有关吗?我很感激任何建议。谢谢。
答案 0 :(得分:4)
错误似乎是由这个循环引起的。
while (palindrome != 0) {
arr[count] = palindrome % 10;
count++;
}
您没有在此循环中更改 palindrome
的值,但是 count
的值正在增加,导致您访问的内存在 count
变得更大时越界size