for 循环中的变量正在发生变化,而不应该在 c 中发生变化

A variable in a for loop is changing without being supposed to change in c

代码如下:

#include <stdio.h> // printf
#include <cs50.h> // get_long
#include <string.h> // strlen
#include <stdlib.h> // stdlib

int credit_test(string input);

int main(void)
{
    string userInput;

    // Gets user input, and tests if input is valid
    bool isInvalid = false;
    do
    {
        userInput = get_string("Number: "); // Prompts user for input

        for(int i = 0, evenIndex = strlen(userInput); evenIndex > i; i++)
        {
            if(userInput[i] - 48 >= 0 && userInput[i] - 48 <= 9 && (strlen(userInput) == 15 || strlen(userInput) == 16)) // Tests if input is valod
            {
                isInvalid = false;
            }
            else
            {
                isInvalid = true;
                break;
            }
        }
    }
    while(isInvalid);

    int keyValidity = credit_test(userInput);
}

int credit_test(string input)
{
    int inputLen;
    inputLen = strlen(input);

    // Even number calculation

    int evenArr[16];

    int evenSum = 0;

    int evenIndex = 0;

    printf("Length: %i\n", inputLen);

    for(int i = 0; inputLen > i; i++)
    {
        int n = i * 2;

        evenArr[evenIndex] = input[n] * 2;

        if(evenArr[evenIndex] > 0)
        {
            evenArr[evenIndex] -= 96;
        }

        if(evenArr[evenIndex] > 9) // Code to split doubles
        {
            int doubleNum = evenArr[evenIndex];

            evenArr[evenIndex] = 1;

            evenIndex++;

            evenArr[evenIndex] = doubleNum % 10;
        }

        evenIndex++;

        evenSum += evenArr[i];

        printf("%i\n", evenArr[i]);
        printf("Length: %i\n", inputLen);
    }

    printf("Length: %i\n", inputLen);

    printf("Even Sum: %i\n", evenSum);

    // Odd number calculation

    int oddArr[16];

    int oddSum = 0;

    int oddIndex = 1;


    for(int i = 0; 16 > i; i++)
    {
        oddArr[i] = input[oddIndex];

        if(oddArr[i] > 0)
        {
            oddArr[i] -= 48;
        }

        oddSum += oddArr[i];

        oddIndex += 2;

        printf("%i\n", oddArr[i]);
    }

    printf("Odd Sum: %i\n", oddSum);

    // Validity test

    int finalSum = evenSum + oddSum;

    int cardType = finalSum % 10;

    printf("Final Sum: %i\n", finalSum);



    if(cardType == 0 && (input[0] - 48) == 5)
    {
        printf("MasterCard \n");
    }else if (cardType == 0 && (input[0] - 48) == 4)
    {
        printf("Visa \n");
    }else if(cardType == 0 && (input[0] - 48) == 3)
    {
        printf("Amex \n");
    }else
    {
        printf("Invalid \n");
    }

    return 0;
}

我只是想不通为什么,但是如果你 运行 代码,并留意“inputLen”变量,它会保持它应该的样子,但在第一个 for 循环中输入中的偶数,inputLen 保持不变,这是正确的,但是当循环结束时,由于某种原因,变量变为 0?那么有人介意解释为什么会这样吗?抱歉,如果代码全都不稳定和糟糕:)

非常感谢。

这部分循环

for(int i = 0; inputLen > i; i++)
{
    int n = i * 2;

    evenArr[evenIndex] = input[n] * 2;

    //...

调用未定义的行为,因为由于使用表达式 i * 2 作为索引,表达式 input[n] 可以访问超出使用数组的内存。例如,然后 i 等于 inputLen - 1 然后 n 将由表达式 2 * ( inputLen - 1 ) 和您用作索引以访问数组元素的表达式的值初始化 input 但是数组没有那么多元素。

也在这段代码中

    if(evenArr[evenIndex] > 9) // Code to split doubles
    {
        int doubleNum = evenArr[evenIndex];

        evenArr[evenIndex] = 1;

        evenIndex++;

        evenArr[evenIndex] = doubleNum % 10;
    }

    evenIndex++;

变量 evenIndex 可以递增两次,当此变量用作访问数组 evenArr.

元素的索引时,这又可能是未定义行为的原因