最近,我又回到了C语言,并决定从HackerRank开始会很好. 有这样一个问题:https://www.hackerrank.com/challenges/for-loop-in-c.

我试过这个:

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

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

    return 0;
}

并得到了以下输出:

eightnine
nine
even
odd

我知道这样做的首选方法是使用const char*数组,但这不也应该起作用吗?为什么要多打印一个"九"字呢?

推荐答案

"three"这样的字符串包含6个字符,其中包括终止零字符'\0'.

因此,您需要至少像这样声明数组rep

char rep[9][6] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

否则,在此printf的调用中使用的转换说明符%s

printf("%s\n", rep[i - 1]);

将try 输出所有字符,直到遇到终止零字符'\0'.

尽管更好的方法是像这样声明数组

const char *rep[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
size_t N = sizeof( rep ) / sizeof( *rep );

在for循环的if语句中,您可以编写

    if( 1 <= i && i <= N )

请注意,在C++中,编译器会发出错误消息,因为声明

char rep[9][5] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

在C++中无效.

C++不允许忽略用作字符数组初始值的字符串文字的终止零字符.

C++相关问答推荐

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

理解没有返回语句的递归C函数的行为

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

不会停在空格或换行符上的错误

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

Clang警告称,`ffi_type`与`sizeof`不兼容

插座打开MacOS组件

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

防止C++中递归函数使用堆栈内存

每次除以或乘以整数都会得到0.0000

C语言中的外部关键字

运行时错误:在索引数组时加载类型为';char';`的空指针

静态初始化顺序失败是否适用于C语言?

具有正确标头的C struct 定义问题

函数指针作为函数参数 - 应该使用 const 吗?

memcmp 是否保证按顺序比较字节?

将数组返回到链表

可以从指针数组中的值初始化指针吗?

C simd _m128 晶圆厂

strlen 可以是[[未排序]]吗?