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 */
}
我已经尝试搜索此问题的答案,当您不确切知道要搜索的内容时,这会有点棘手,但这里是。
我现在正在学习 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 */
}