我一直试着寻找这个问题的答案,当你不确切地知道你在寻找什么时,这有点棘手,但是这里有。
我现在正在通过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。
再次,非常感谢反馈 - 我感谢这不是一个教程网站 - 但有时很难找出你不知道的东西。谢谢你的帮助!
答案 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 */
}