C 为什么会有结果;“八号线”;当我们输入的是8和11时,会合在一起吗?

C 为什么会有结果;“八号线”;当我们输入的是8和11时,会合在一起吗?,c,arrays,for-loop,C,Arrays,For Loop,当我使用输入8和11运行代码时,输出是 eightnine odd even odd 我预期的结果是: eight nine odd even 为什么八行出现在同一行上?循环有问题吗 #include <stdio.h> #include <string.h> int main() { int a, b; scanf("%d\n%d", &a, &b); char list[11][5]={"one","two","three",

当我使用输入8和11运行代码时,输出是

eightnine
odd
even
odd
我预期的结果是:

eight
nine
odd
even
为什么八行出现在同一行上?循环有问题吗

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

int main() {
int a, b;

    scanf("%d\n%d", &a, &b);

    char list[11][5]={"one","two","three","four","five","six","seven","eight","nine","even","odd"};
    int i;
    for (i=a;i<=b;i++)
    {
        printf("%s \n",(i<9?list[i-1]:list[9+i%2]));
    }

     return 0;
}
#包括
#包括
int main(){
INTA,b;
scanf(“%d\n%d”、&a和&b);
字符列表[11][5]={“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“偶数”、“奇数”};
int i;

对于(i=a;i您需要
字符列表[11][6]
,也就是说,您需要为5个字符的单词的NUL(终止C样式字符串的0)留出空间

尽管如此,我还是更愿意

char* list[] ={"one","two","three","four","five","six","seven","eight","nine","even","odd"};
所有这些问题都消失了。让编译器来计算吧!

因为这里

 char list[11][5]
您没有足够的空间来存储所有字符串。最大的单词长度为
5
个字母,但如果使用空终止符,则每个单词需要
6个字符。因此,空终止符被删除,内存中剩下的是
8行
,中间没有空终止符

将其更改为
字符列表[11][6]
,它就可以工作了


但是你真的需要堆栈上的字符串吗?你可以把它作为
char*list[11]
,则无需硬编码最长的字长。

格式转换说明符
s
需要一个指向字符串第一个字符的参数,函数
printf
输出字符串的字符,直到遇到终止零字符为止

正如你宣布的那样

char list[11][5] = { /* ...*/ };
             ^^^
然后,这些字符串初始值设定项
“三个”
“七个”
“八个”
存储在数组中,而不终止于零

因此,数组的对应元素按顺序存储,例如

...{ 'e', 'i', 'g', 'h', 't' }, { 'n', 'i', 'n', 'e', '\0' }, ... 
因此,使用格式转换说明符
s
输出数组的第7个元素,您将得到
eightnine

因此需要放大数组的最外层维度,如

char list[11][6] = { /* ...*/ };
             ^^^
但无论如何,最好将数组定义为一维常量数组

const char * list[] = 
{
    "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "even", "odd"
};
我还添加了字符串literal
“zero”

在这种情况下,不需要担心数组的第二维度

还要注意,由于变量
a
b
的类型是
int
,因此用户可以输入负数。在这种情况下,程序将具有未定义的行为

所以重新声明变量,如

unsigned int a, b;
scanf("%u%u", &a, &b);
这是一个演示程序

#include <stdio.h>

int main( void )
{
    const char * list[] =
    {
        "zero", "one", "two", "three", "four", "five", "six", 
        "seven", "eight", "nine", "even", "odd" 
    };
    const unsigned int N = 10;

    unsigned int a, b;

    scanf( "%u%u", &a, &b );

    if ( b < a )
    {
        unsigned int tmp = a;
        a = b;
        b = tmp;
    }

    for ( unsigned int i = a; i <= b; i++ )
    {
        printf( "%s\n", i < N ? list[i] : list[N + i % 2] );
    }

    return 0;
}
关于:

printf("%s \n", (i<9)? list[i-1] : list[9+(i%2)] );
注意:为便于阅读和理解,应在语法部分之间插入空格。建议替换:

printf("%s \n",(i<9?list[i-1]:list[9+i%2]));

printf(“%s\n”),(iIt不是未定义的行为:在C中,如果数组在初始化时没有nul终止符的空间,则为。
eight 
odd 
even 
odd

index 8 selects "eight" from the list
index 9 is the sum of  9+1 = list[ 10 ] = "odd"
index 10 is the sum of 9+0 = list[ 9  ] = "even"
index 11 is the sum of 9+1 = list[ 10 ] = "odd"
printf("%s \n",(i<9?list[i-1]:list[9+i%2]));
printf("%s \n", (i<9)? list[i-1] : list[9+(i%2)] );