gpt4 book ai didi

c - 在 C 中的循环内重置变量值

转载 作者:行者123 更新时间:2023-11-30 20:31:32 24 4
gpt4 key购买 nike

我有一个案例,我必须确定一个数字是正数、负数还是零,并计算每种情况发生的次数。我写的代码是这样的:

#include 
#include
#include

using namespace std;

int main(int argc, char *argv[])
{
char opcion = 's';
int positivos = 0;
int negativos = 0;
int ceros = 0;
//int ceros2 = 0;
int temporal;
do{
printf("Enter a number: ");
scanf("%d",&temporal);
if(temporal >= 0)
{
if(temporal==0)
{
ceros ++;
}
else
{
positivos ++;
}
}

if(temporal < 0)
{
negativos ++;
}
printf("Do you want to enter another number? (s/n)");
scanf("%s",&opcion);
}
while(opcion == 's' || opcion=='S');
printf("you have %d possitive numbers \n",positivos);
printf("you have %d negative numbers \n",negativos);
printf("you have %d zero \n",ceros);
return 0;
}

如果我按原样运行代码,零的数量将始终为零,但如果取消注释第 13 行 int ceros2 = 0; (我的逻辑是“让我们声明另一个初始化变量看看会发生什么”)然后程序将按预期计算零。为什么我必须声明一个无用的变量才能让程序进行计数?

除非声明一个新的初始化变量,否则 C 编译器会如何处理不尊重最后声明和初始化变量的值的代码?

最佳答案

您要求 scanf() 读取一个 C 字符串,如果用户键入一个字符,该字符串将包含该字符和空终止符。您只提供了一个角色的存储空间。因此,空终止符不适合,但它会存储在某个地方。事实上,它会破坏堆栈上 opcion 旁边的其他数据,而这些数据恰好是您的 ceros 变量。

声明另一个变量重新组织了堆栈上数据的布局并更改了被破坏的内容,因此您没有注意到它。但它仍然写出越界。

您可以使用格式字符串“%c”来读取单个字符。

关于c - 在 C 中的循环内重置变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50440129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com