当我使用输入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;
}发布于 2019-09-12 13:29:26
因为在这里
char list[11][5]您没有足够的空间存储所有字符串。最大的单词是5字母长,但是对于空终止符,这是一个单词需要的6字符。结果,空终止符被删除,内存中剩下的是没有空终止符的eightnine。
将其更改为char list[11][6],它就能工作了。
但你真的需要堆栈上的那些字符串吗?您可以将它作为char *list[11],这样就不需要对最长的字长进行硬编码。
发布于 2019-09-12 13:29:02
您需要char list[11][6],也就是说您需要NUL的空间(终止C风格字符串的0)用于5个字符字。
尽管如此,我更希望
char* list[] ={"one","two","three","four","five","six","seven","eight","nine","even","odd"};所有这些问题都消失了。让编译器来做计数!
发布于 2019-09-12 13:44:51
格式转换说明符s需要指向字符串的第一个字符的参数,函数printf输出字符串的字符,直到遇到终止零字符为止。
就像你宣布的
char list[11][5] = { /* ...*/ };
^^^然后,这些字符串初始化器"three"、"seven“和"eight"存储在数组中,而不终止零。
因此,数组的对应元素按顺序存储,例如
...{ '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"
};我还添加了字符串文本"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;
}如果要输入0和11,则输出将显示
zero
one
two
three
four
five
six
seven
eight
nine
even
oddhttps://stackoverflow.com/questions/57907770
复制相似问题