我正在用C语言编写一个程序,它给定整数[a-b]的间隔,打印该间隔中1-9之间的所有值的整数,并且对于所有值>9,它只打印它们是偶数还是奇数,我知道该代码对于有经验的程序员来说可能是不可读的

我试着运行它并弄乱了一点,在打印最后一个整数(9)并且必须打印"偶数"或"奇数"之后,我得到了一个空输出,我不知道为什么会发生这种情况

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

int main() 
{
    int a, b;
    scanf("%d\n%d", &a, &b);
    char *nums[9] = {"one","two","three","four","five","six","seven","eight","nine"};

    for(int i = 0; (i+a) <= b; i++){
        if(1 <=(a+(i-1)) && 9 >=(a+(i-1))){
            printf("%s\n", nums[(a+(i-1))]);
        } else if (((a+(i-1))%2)==1) {
            printf("odd\n");
        } else {
            printf("even\n");
        }
    }
    return 0;
}

推荐答案

当数字10出现在给定的间隔内时,代码中的错误出现.

for内,第一个if判断a+i减1是否小于9.

如果a+i恰好是10,例如给定的间隔是[10-12]和i=0,则条件的计算结果为TRUE,因为:

1 <= a+i-1等于1 <= 10+0-1,这是真的, 9 >= a+i-1等于9 >= 10+0-1,这也是正确的.

在本例中,您将打印nums[(a+(i-1))],这相当于nums[10+0-1],即nums[9],并且由于您的数组只有8个元素,它可能会触发分段错误,从而立即停止执行.

根据您看到输出的位置,这个错误看起来可能只是打印了一个随机的空行,但它实际上是您的程序的运行时错误.

请注意,只要a+i等于10,就会发生这样的事情,当10在给定的区间内时就会发生这种情况.

同样在第二个if中,因为其中也有-1,所以它将为奇数打印even,反之亦然.

我更改了您的代码,试图保持您的语法不变:

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

int main() 
{
    int a, b;
    scanf("%d\n%d", &a, &b);
    char *nums[9] = {"one","two","three","four","five","six","seven","eight","nine"};

    for(int i = 0; (i+a) <= b; i++){
        if(1 <=(a+i) && 9 >=(a+i)){
            printf("%s\n", nums[(a+(i-1))]);
        } else if (((a+i)%2)==1) {
            printf("odd\n");
        } else {
            printf("even\n");
        }
    }
    return 0;
}

C++相关问答推荐

有效地计算由一组点构成的等边三角形和等腰三角形的数量

C指针算法在函数参数中的应用

为什么输出不是从上到下C

C语言中的strstr问题

struct 上的OpenMP缩减

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

使用错误的命令执行程序

X64:并发写入布尔数组

如何在C中使数组变量的值为常量?

理解bzip2的BZ2_解压缩函数中的状态重新分配

无法识别C编程语言的语法,如书中所示

int * 指向int的哪个字节?

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

不兼容的整数到指针转换传递';char';到类型';常量字符*

如何在Rust中处理C的longjmp情况?

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

快速准确计算double的小数指数

用于内存布局的size命令(文本、数据、bss)