C 为什么会有结果;“八号线”;当我们输入的是8和11时,会合在一起吗?
当我使用输入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",
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)] );