【问题标题】:Unexplained Characters Within Output of C ProgramC 程序的输出中出现无法解释的字符
【发布时间】:2019-10-07 07:30:48
【问题描述】:

我制作了一个简单的 c 程序,用于测试在一个简单的基于文本的 rpg 中输入经验点。它绝不是最终的,只是为了测试。它使用具有 6 个索引(0 到 5)的整数数组来存储 6 个不同的“级别”。这些“级别”根据用户输入的数字加 1。

它现在所做的只是提示输入整数,然后将该输入和数组传递给另一个函数。此函数使用 if/else if 结构来确定输入的数字是否在某个范围内,并根据该范围将特定数组索引的整数值增加 1。然后将数组传递回“main”。这是在一个while循环中,所以当我不输入-1时,循环会运行,每次都会传递输入的整数值和数组。

输入 -1 后,程序将调用另一个将数组传递给它的函数。最后一个函数使用 for 循环输出数组中每个索引位置的值。然后程序结束。

例如,如果我输入数字 5 六次,数字 15 输入十次,数字 35 输入一次,输出应该是这样的:

T O T A L S

Level 1    6
Level 2    10
Level 3    0
Level 4    1
Level 5    0
Level 6    0

我得到的是在输出中包含小数点,如下所示:

T O T A L S

Level 1    .6
Level 2    .10
Level 3    .0
Level 4    .1
Level 5    .0
Level 6    .0

为什么会发生这种情况,我应该怎么做才能摆脱它们?

代码:

#include <stdio.h>

int update_level(int points, int arr[]);
void display_levels(int arr[]);


int main(void)
{
    int pointVal = 0;
    int *proxy;
    int pointArr[6] = {0, 0, 0, 0, 0, 0};

    while (pointVal != -1)
    {
        printf("Player points (-1 to quit): ");
        scanf("%d", &pointVal);

        proxy = update_level(pointVal, pointArr);
    }

    display_levels(proxy);
    return 0;
}

int update_level(int points, int arr[])
{
    if (points >= 0 && points < 15)
    {
        arr[0]++;
    }
    else if (points >= 15 && points < 25)
    {
        arr[1]++;
    }
    else if (points >= 25 && points < 35)
    {
        arr[2]++;
    }
    else if (points >= 35 && points < 45)
    {
        arr[3]++;
    }
    else if (points >= 45 && points < 55)
    {
        arr[4]++;
    }
    else if (points >= 55)
    {
        arr[5]++;
    }

    return arr;
}

void display_levels(int arr[])
{
    int level;

    puts("\nT O T A L S\n");
    for (int i = 0; i < 6; i++)
    {
        level = i + 1;
        printf("Level %d%5c%d\n", level, "", arr[i]);   
    }
}

【问题讨论】:

  • 我还应该补充一点,如果我删除 puts("\nT O T A L S\n");一行代码,小数点消失。同样,不知道为什么。
  • 你的编译器没有收到关于最后一个 printf 的警告吗?如果没有,请尝试调整警告级别并详细查看它们。
  • 你试过用-Wall -Wextra编译吗?警告应该可以帮助您解决问题
  • 一秒钟,我看看
  • 是的。我正在使用 Dev C++,我收到以下警告:[Warning] assignment make pointer from integer without a cast and: [Warning] return makes integer from pointer without a cast

标签: c arrays


【解决方案1】:

在函数 display_levels 中,您尝试使用 "%5c" 打印一个字符,但将字符串文字 "" 作为参数,这会导致 UB(未定义行为),这是一个充满惊喜的潘多拉盒子。
您应将参数替换为 ' ' 以获得预期结果。

printf("Level %d%5c%d\n", level, ' ', arr[i]);
/*                               ^^^            */

或者,您可以将"%5c" 替换为"%5s"

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2017-07-19
    • 2012-06-23
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多