首页 > 解决方案 > 获取字符串数组的意外输出

问题描述

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

预期的:

one
two
three
four
five
six
seven
eight
nine

得到:

one
two
threefour
four
five
six
seveneightnine
eightnine
nine

标签: cfor-loopmultidimensional-arrayprintfc-strings

解决方案


并非此数组的所有元素

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

包含一个字符串。元素的类型是char[5]。因此,例如字符串文字"three"不完全包含在数组的第三个元素中,因为没有空间来存储'\0'字符串文字的终止零字符,并且转换说明符%s旨在输出字符,直到'\0'遇到终止零字符。这就是出现这样的输出的原因

threefour
seveneightnine
eightnine

所以要么你需要增加数组元素的大小,比如

char s[9][6]= { /*...*/ };

或在调用中使用以下格式字符串printf

printf("%.*s\n", 5, s[i-1]);

注意这个 if 语句

  if(i<10)

没有多大意义,因为 i 总是小于 10。


推荐阅读