对于循环和模数没有正确执行

时间:2016-02-21 19:35:53

标签: c

我正在尝试编写一个允许用户输入所需数字位数的程序,然后它将交换第一个和最后一个数字,然后在加上模数为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 }

1 个答案:

答案 0 :(得分:6)

主要

  1. 该行

    int n, i, input[n], newInput[n];
    

    表现出未定义的行为,因为n的值是不确定的(与任何未初始化的自动变量一样),但您仍然使用该变量来定义VLA。

    将VLA定义移至n初始化之后,即scanf之后。

  2. 检查scanf的返回值,即匹配数。如果用户输入的是字母而不是数字,则变量将保持未初始化且具有不确定的值,最有可能产生未定义的行为。

  3. 由于您在行上访问数组的i th 成员

    *(b+i) = (*(a+i) + 6) % 10;
    

    最后一次访问将超出范围,因为

    for (i = 0;i<=n; i++)
    

    会将值n分配给i。索引从0开始,因此访问array[n]是未定义的行为。 请注意:单独指向该位置的指针会产生未定义的行为。

  4. 次要

    1. 在线

      *(b+i) = (*(a+i) + 6) % 10;
      

      为什么在下标运算符更具可读性时使用解除引用?用

      替换该行
      b[i] = (a[i] + 6) % 10;