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

时间:2017-06-24 14:19:46

标签: c cs50

我一直试着寻找这个问题的答案,当你不确切地知道你在寻找什么时,这有点棘手,但是这里有。

我现在正在通过CS50(非常新的 - 我知道一些HTML / CSS,我的日常工作是营销)。我正处于第1周的最后一个问题 - 我通过做更难的问题以及简单的问题让自己变得棘手,但我很想学习。到目前为止,我们还没有谈到数组,我怀疑这可能是这个问题的答案,但没有更多的知识,我无法确定。

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

如何将原始值存储在某处,以便可以访问它而无需创建数十个新变量来充当占位符? (注意 - 下面只是我的代码的一小部分作为示例 - 我不想包括整个事情)

e.g。

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位之间变化)并且看起来比这个问题调用更复杂对

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

编辑:感谢所有为我的第一个问题提供答案的人!虽然可能有“更好”的解决方案,但似乎考虑到我对我的解决方案规范的限制,我做得很好并且只是真的过度思考它。我接受了人们的建议,复制变量,最后几分钟前就完成了所有工作。

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

我必须遇到的原始规范是here

再次,非常感谢反馈 - 我感谢这不是一个教程网站 - 但有时很难找出你不知道的东西。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

您可能正在寻找

中附加块的声明
#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保持不变,即使该函数与它一起工作。当通过引用传递参数时,这将是不同的,即,如“&amp;”所示。

答案 1 :(得分:0)

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

你可以制作两个变量

long long len;
long long lenWork;

len = yourValue;
lenWork = len;

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

答案 2 :(得分:0)

您可能忘记将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 */
}