首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们输入为8和11时,为什么结果“八十九”会出现在一起?

当我们输入为8和11时,为什么结果“八十九”会出现在一起?
EN

Stack Overflow用户
提问于 2019-09-12 13:25:42
回答 4查看 95关注 0票数 2

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

代码语言:javascript
复制
eightnine
odd
even
odd

我期望的结果是:

代码语言:javascript
复制
eight
nine
odd
even

为什么八十九出现在同一条线上?循环有问题吗?

代码语言:javascript
复制
#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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-09-12 13:29:26

因为在这里

代码语言:javascript
复制
 char list[11][5]

您没有足够的空间存储所有字符串。最大的单词是5字母长,但是对于空终止符,这是一个单词需要的6字符。结果,空终止符被删除,内存中剩下的是没有空终止符的eightnine

将其更改为char list[11][6],它就能工作了。

但你真的需要堆栈上的那些字符串吗?您可以将它作为char *list[11],这样就不需要对最长的字长进行硬编码。

票数 4
EN

Stack Overflow用户

发布于 2019-09-12 13:29:02

您需要char list[11][6],也就是说您需要NUL的空间(终止C风格字符串的0)用于5个字符字。

尽管如此,我更希望

代码语言:javascript
复制
char* list[] ={"one","two","three","four","five","six","seven","eight","nine","even","odd"};

所有这些问题都消失了。让编译器来做计数!

票数 6
EN

Stack Overflow用户

发布于 2019-09-12 13:44:51

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

就像你宣布的

代码语言:javascript
复制
char list[11][5] = { /* ...*/ };
             ^^^

然后,这些字符串初始化器"three""seven“和"eight"存储在数组中,而不终止零。

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

代码语言:javascript
复制
...{ 'e', 'i', 'g', 'h', 't' }, { 'n', 'i', 'n', 'e', '\0' }, ... 

因此,使用格式转换说明符s输出数组的第7个元素,您将得到eightnine

因此,您需要放大数组的最外层尺寸,例如

代码语言:javascript
复制
char list[11][6] = { /* ...*/ };
             ^^^

但是无论如何,最好像一维常量数组那样定义数组。

代码语言:javascript
复制
const char * list[] = 
{
    "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "even", "odd"
};

我还添加了字符串文本"zero"

在这种情况下,不需要考虑数组的第二个维度。

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

因此,请重新声明以下变量

代码语言:javascript
复制
unsigned int a, b;
scanf("%u%u", &a, &b);

这里有一个演示程序

代码语言:javascript
复制
#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;
}

如果要输入011,则输出将显示

代码语言:javascript
复制
zero
one
two
three
four
five
six
seven
eight
nine
even
odd
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57907770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档