for循环中的变量正在改变,而不应该在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: %in", 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("%in", evenArr[i]);
printf("Length: %in", inputLen);
}
printf("Length: %in", inputLen);
printf("Even Sum: %in", 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("%in", oddArr[i]);
}
printf("Odd Sum: %in", oddSum);
// Validity test
int finalSum = evenSum + oddSum;
int cardType = finalSum % 10;
printf("Final Sum: %in", 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";变量it保持原样,但在第一个获得输入中偶数的for循环中,inputLen保持不变,这是正确的,但当循环结束时,由于某种原因,变量变为0?那么,有人愿意解释一下为什么会发生这种事吗?很抱歉,如果代码都不稳定和糟糕:(

非常感谢。

循环的这一部分

for(int i = 0; inputLen > i; i++)
{
int n = i * 2;
evenArr[evenIndex] = input[n] * 2;
//...

调用未定义的行为,因为由于使用表达式i * 2作为索引,表达式输入[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++;

变量CCD_ 5可以被增加两倍,这在该变量被用作访问数组CCD_。

最新更新