C - 有没有办法让变量在循环外保持不变?

C - Is there a way to leave a variable unchanged outside of the loop?

我已经尝试搜索此问题的答案,当您不确切知道要搜索的内容时,这会有点棘手,但这里是。

我现在正在学习 CS50(这方面很新 - 我知道一点 HTML/CSS,我的日常工作是市场营销)。我在做第 1 周的最后一道题——我通过做更难的题和简单的题来让自己变得棘手,但我渴望学习。到目前为止我们还没有讨论数组,我怀疑这可能是这个问题的答案,但没有更多的知识我不能确定。

我正在研究信用卡验证器,我必须在其中做一些事情,比如获取要验证的卡号的长度、添加不同的数字等。我正在努力的地方是,如果我改变一个变量以某种方式在循环中,当我再次使用该变量时,它具有新值 - 而不是原始值。

如何将原始值存储在某处,以便在无需创建许多新变量来充当占位符的情况下访问它? (注意 - 下面只是我的一小段代码作为示例 - 我不想包含整个内容)

例如

long long credit;           // credit card number
long long len;              // used to work out len of card number - feeds into count

// validate length of credit card number and get length of card

len = credit;
while (len > 0)
{
    len /= 10;
    count ++;
}

在上面的示例中,如果我想在我的代码中进一步使用 len,它的值将为 0。我如何确保原始值保留在某个地方供我在以后的循环中访问?

我怀疑我需要以某种方式使用数组,但到目前为止我们只介绍了数据类型、布尔值、运算符、条件语句和循环(加上 printf)。我在网上找到的关于数组的所有信息都在谈论需要指定数组大小(关键是我在这个例子中不知道 - 值可以在 13 到 16 位之间变化)并且看起来比这个问题调用更复杂对于.

我很确定我错过了一些非常简单的东西 - 我只是不知道它是什么!

编辑:感谢所有为我的第一个问题提供答案的人!虽然可能有 "better" 解决方案,但考虑到我对解决方案规范的限制,我似乎做得很好,只是想得太多了。我听取了人们的建议来复制变量,并在几分钟前终于让一切正常。

如果有人想看它(尽管我确信我的代码可以改进),我的解决方案是 here

我必须满足的原始规范是 here

再一次,非常感谢您的反馈 - 我很感激这不是一个教程网站 - 但有时可能很难解决您不知道的问题。感谢您的帮助!

您可能正在寻找其他块的声明,如

#include<stdio.h>
int main() {
  int i=1;
  printf("before %d\n",i);
  {
    int i=0;
    printf("within %d\n",i);
  }
  printf("after %d\n",i);
  return(0);
}

执行时产生

before 1
within 0
after 1

从评论中我了解到,函数调用可能更可取,例如

#include<stdio.h>
int div_10_count(long long val) {
    int count=0;
    while(val>0) {
        val /= 10;
        count++;
    }
    return(count);
}

int main() {
  long long val=10000000000L;
  printf("Before: val=%lld\n",val);
  printf("Returned: %d\n",div_10_count(val));
  printf("After: val=%lld\n",val);
  return(0);
}

显示

Before: val=10000000000
Returned: 11
After: val=10000000000

所以变量 val 保持不变,即使函数使用它也是如此。这在通过引用传递参数时会有所不同,即用“&”表示。

使用临时变量有什么问题?

你可以只做两个变量

long long len;
long long lenWork;

len = yourValue;
lenWork = len;

/* Work with lenWork */
lenWork = len;
/* Once again */
lenWork = len;
/* etc... */

您可能忘记将 count 变量初始化为 0

使用更明确的变量名:

unsigned long long credit;  // credit card number

// get length of the credit card number
int count = 0;
for (unsigned long long tmp = credit; tmp > 0; tmp /= 10) {
    count++;
}

这里有一个更直接的方法:

if (snprintf(NULL, 0, "%llu", credit) == 16) {
    /* credit card number has 16 digits */
}

您还可以使用更简单但可读性较差的方法:

if (credit >= 1000000000000000 && credit < 10000000000000000) {
    /* credit has 16 digits */
}