【问题标题】:Invalid int in scanf and printfscanf 和 printf 中的 int 无效
【发布时间】:2015-02-12 05:57:54
【问题描述】:

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

这是代码:

#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");
}

【问题讨论】:

  • for (i=5; i&gt;0; i--){ --> for (i = 5; i-- &gt; 0; ) {i=5; do { i--; printf("%i \n", numeros[i]); } while (i &gt; 0);i=sizeof numeros/sizeof numeros[0]; do { ... 或许多其他选择。

标签: c arrays int printf scanf


【解决方案1】:

数组从索引 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--){

【讨论】:

    【解决方案2】:

    你的第二个循环必须是

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

    而不是

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

    它们以0 开头并以length-1 结尾

    它们可以被描绘成。

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

    【讨论】:

    • @2501 是啊,忘记加&gt;=现在好了
    • 我不知道,也许他们看到了错误的答案,投了反对票并离开了页面。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        • 1970-01-01
        • 2017-11-26
        • 2021-12-04
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多