我正在尝试编写一个允许用户输入所需数字位数的程序,然后它将交换第一个和最后一个数字,然后在加上模数为10的6后打印出新的数字。
我似乎无法正确计算/打印。
例如,如果我输入92821,它将交换9和1,然后在模数为10的每个数字上加6,所以它将打印出48487。
我的问题是当我输入597时,它应该输出351,但它输出为053。 当我输入1050时,它应输出为6617,但输出为6616。
11 #include <stdio.h>
12
13 //pointers
14 void replace(int *a, int *b, int n);
15 void swap(int *a, int *b)
16 {
17 int temp = *a;
18 *a = *b;
19 *b = temp;
20 }
21
22 int main(void)
23 {
24 int n, i, input[n], newInput[n];
25
26 //asks for number of digits
27 printf("Enter total number of digits: ");
28 scanf("%d", &n);
29
30 //user input
31 printf("Enter a number: ");
32 for (i=0; i<n; i++)
33 scanf("%1d", &input[i]);
34
35 //replaces first and last number before printing
36 replace(input, newInput, n);
37 for(i=0; i<n; i++)
38 printf("%d", newInput[i]);
39
40 return 0;
41 }
42
43 //using replace pointer
44 void replace (int a[], int b[], int n)
45 {
46 int i;
47 //loops program until input is 0
48 for (i = 0;i<=n; i++)
49
50 //adds 6 to input. Modulus 10
51 *(b+i) = (*(a+i) + 6) % 10;
52
53 //using swap pointer
54 swap(b, b+4);
55
56 }
答案 0 :(得分:6)
该行
int n, i, input[n], newInput[n];
表现出未定义的行为,因为n
的值是不确定的(与任何未初始化的自动变量一样),但您仍然使用该变量来定义VLA。
将VLA定义移至n
初始化之后,即scanf
之后。
检查scanf
的返回值,即匹配数。如果用户输入的是字母而不是数字,则变量将保持未初始化且具有不确定的值,最有可能产生未定义的行为。
由于您在行上访问数组的i
th 成员
*(b+i) = (*(a+i) + 6) % 10;
最后一次访问将超出范围,因为
for (i = 0;i<=n; i++)
会将值n
分配给i
。索引从0
开始,因此访问array[n]
是未定义的行为。 请注意:单独指向该位置的指针不会产生未定义的行为。
在线
*(b+i) = (*(a+i) + 6) % 10;
为什么在下标运算符更具可读性时使用解除引用?用
替换该行b[i] = (a[i] + 6) % 10;