繁体   English   中英

scanf和printf中的int无效

[英]Invalid int in scanf and printf

我最近开始学习C语言编程,现在我正在做这个简单的程序,我应该问用户5个数字并以相反的顺序显示它们。 我设法做的很好,但是有一个很大的问题。 第一个数字很荒谬。 我无法真正解释它,所以我将留下一个图像来显示它:

img

这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{
    int numeros[5];
    int i;

    for (i=0; i<5; i++) {
        scanf("%i", &numeros[i]);
    }
    for (i=5; i>0; i--) {
        printf("%i \n", numeros[i]);
    }

    system("pause");
}

数组从索引0开始,一直到n-1。 因此,您将数组定义为numeros [5],因此n =5。因此,数组从0开始直到5-1 = 4。

您获得的数字(屏幕快照中的负数)是一个垃圾值,在您尝试访问numeros [5]时,运行与运行之间以及计算机与计算机之间可能/可能没有差异。

因此,您需要从以下位置更改for循环

for (i=5; i>0; i--){

for (i=4; i>=0; i--){

您的第二个循环必须是

for (i=4; i>=0; i--)

代替

for (i=5; i>0; i--)

因为它们以0开头并以length-1结束

它们可以描述为。

在此处输入图片说明

因此,您尝试读取的值不在数组中,因此很垃圾

第二个循环计数为5,4,3,2,1。 由于numeros有5个元素,因此第6个元素( numeros[5] )不存在,因此您会得到一个怪异的数字(这在技术上是未定义的行为 )。

一个简单的解决方法是从4倒数到0:

for (i=4; i>=0; i--){
  printf("%i \n", numeros[i]);
}

这是因为数组的最后一个索引始终是数组的长度-1,因为众所周知,在C语言中,数组从0开始。

在您的情况下,数组的长度为5,所以最后一个索引为4。在循环中,您尝试从位置5开始循环,因此您正在访问的内容不属于数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM