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

时间:2018-05-20 22:57:10

标签: c loops zero

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

#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编译器对不遵守最后声明和初始化变量值的代码做什么?

1 个答案:

答案 0 :(得分:0)

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

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

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