int main(void){
int range = 0, i = 0;
printf("Enter the number of digits of the number: ");
scanf("%d", &range);
int a[range];
int b[range];
printf("Enter the number: ");
for(i = 0; i < range; i++){
scanf("%1d", &a[i]);
}
replace(a, b, range);
swap(&b[0],&b[range]);
printf("Output: ");
for(i = range; i > 0; i--){
printf("%d", b[i]);
}
return 0;
}
void replace(int *a, int *b, int n){
int *p;
int temp;
for(p = a; p < a + n; p++){
temp = ((*p + 6) % 10) / 10;
p = b;
*p = temp;
}
}
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是第一个for循环,循环似乎只是继续输入而不是结束.我尝试在替换方法之前放置一个print语句,它没有打印,所以我知道问题出在for循环中.我该如何解决这个问题?
replace()功能是一场灾难你现在发布了这个replace功能,这是一场灾难.
void replace(int *a, int *b, int n)
{
int *p;
int temp;
for (p = a; p < a + n; p++)
{
temp = ((*p + 6) % 10) / 10;
p = b;
*p = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
您尝试迭代这个数组a通过使p点依次在每个元素.但是,然后你在循环体中分配b给p它,它将它放在数组之外a,这意味着所有的赌注都是关闭的.目前尚不清楚是否b小于a + n- 它根本没有定义.但是考虑到你得到一个无限循环,它可能就是这样,所以你的代码会一遍又一遍地读取和写入相同的位置(b[0],b[1])并且p永远不会越来越接近a + n.
一个简单的修复使用索引:
void replace(int *a, int *b, int n)
{
for (int i = 0; i < n; i++)
b[i] = ((a[i] + 6) % 10) / 10;
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用指针,那么:
void replace(int *a, int *b, int n)
{
for (int *p = a; p < a + n; p++)
*b++ = ((*p + 6) % 10) / 10;
}
Run Code Online (Sandbox Code Playgroud)
请注意,表达式的计算结果为零.模10运算产生的值在0..9(或-9 .. + 9)范围内,除以10的值始终为0.您需要处理该表达式.
swap()打破了你有:
swap(&b[0], &b[range]);
Run Code Online (Sandbox Code Playgroud)
这肯定会从b数组的边界访问数据.为了安全起见,您需要使用:
swap(&b[0], &b[range-1]);
Run Code Online (Sandbox Code Playgroud)
你有:
printf("Output: ");
for(i = range; i > 0; i--){
printf("%d", b[i]);
}
Run Code Online (Sandbox Code Playgroud)
您需要避免b[range]再次访问,并且需要在最后输出换行符:
printf("Output: ");
for (i = range; i > 0; i--)
printf("%d", b[i-1]);
putchar('\n');
Run Code Online (Sandbox Code Playgroud)
输入代码可以正常工作,正如您对所获得的内容的最小调整所证明的那样:
#include <stdio.h>
int main(void)
{
int range = 0, i = 0;
printf("Enter the number of digits in the number: ");
if (scanf("%d", &range) != 1)
{
fprintf(stderr, "Oops 1\n");
return 1;
}
printf("Number of digits: %d\n", range);
int a[range];
printf("Enter the number: ");
for (i = 0; i < range; i++)
{
if (scanf("%1d", &a[i]) != 1)
{
fprintf(stderr, "Oops 2\n");
return 2;
}
printf("Digit %d: %d\n", i, a[i]);
}
printf("Reversed input: ");
for (i = range; i > 0; i--)
printf("%2d", a[i-1]);
putchar('\n');
return 0;
}
Run Code Online (Sandbox Code Playgroud)
"反向输入"循环是对问题中"输出"循环的改编 - 修复了错误以避免访问数组越界,并使用a而不是b.错误消息非常缺乏信息(不适合生产工作),但它们足以识别在调试时哪个语句导致错误.
示例运行:
$ ./example-input
Enter the number of digits in the number: 12
Number of digits: 12
Enter the number: 1234 5678 9101112
Digit 0: 1
Digit 1: 2
Digit 2: 3
Digit 3: 4
Digit 4: 5
Digit 5: 6
Digit 6: 7
Digit 7: 8
Digit 8: 9
Digit 9: 1
Digit 10: 0
Digit 11: 1
Reversed input: 1 0 1 9 8 7 6 5 4 3 2 1
$
Run Code Online (Sandbox Code Playgroud)
现在,将其调整到您的程序中,看看问题到底在哪里.
#include <stdio.h>
static void swap(int *a, int *b);
static void replace(int *a, int *b, int n);
int main(void)
{
int range = 0, i = 0;
printf("Enter the number of digits in the number: ");
if (scanf("%d", &range) != 1)
{
fprintf(stderr, "Oops!\n");
return 1;
}
printf("Number of digits: %d\n", range);
int a[range];
int b[range];
printf("Enter the number: ");
for (i = 0; i < range; i++)
{
if (scanf("%1d", &a[i]) != 1)
{
fprintf(stderr, "Oops 2\n");
return 2;
}
printf("Digit %d: %d\n", i, a[i]);
}
printf("Reversed input: ");
for (i = range; i > 0; i--)
printf("%2d", a[i-1]);
putchar('\n');
replace(a, b, range);
swap(&b[0], &b[range-1]);
printf("Output: ");
for (i = range; i > 0; i--)
printf("%2d", b[i-1]);
putchar('\n');
return 0;
}
static void swap(int *p, int *q)
{
int t = *p;
*p = *q;
*q = t;
}
static void replace(int *a, int *b, int n)
{
for (int *p = a; p < a + n; p++)
*b++ = ((*p + 6) % 10);
}
Run Code Online (Sandbox Code Playgroud)
$ ./example-input
Enter the number of digits in the number: 9
Number of digits: 9
Enter the number: 123 456 789
Digit 0: 1
Digit 1: 2
Digit 2: 3
Digit 3: 4
Digit 4: 5
Digit 5: 6
Digit 6: 7
Digit 7: 8
Digit 8: 9
Reversed input: 9 8 7 6 5 4 3 2 1
Output: 7 4 3 2 1 0 9 8 5
$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |