表初始化失败并带有变量

时间:2013-07-17 23:21:25

标签: c

我需要创建一个打印以下输出的控制台程序:

aaaaaaaaa
abbbbbbba
abcccccba
abcdddcba
abcdedcba
abcdddcba
abcccccba
abbbbbbba
aaaaaaaaa

所以我做了以下代码,似乎有用:

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

int main()
{
   int c, i = 0, p;

   scanf("%d", &c);

   int len = c*2-1;

   printf("%d\n", len);

   char ligne[9];

   while (i < len-1){
      p = 0;
      for (int j = 0; j < c; j++){
         ligne[len-1-j] = p+97;
         ligne[j] = p+97;
         if (j < c && p < i)
            p++;
      }
     printf("%s\n", ligne);
      i++;
   }

   return 0;
}

这似乎有效,但当我更换时:

char ligne[9];

通过:

char ligne[len];

我获得以下输出:

Your program output contains an invalid UTF8 character.

似乎桌子以某种方式“扩展”:其​​中有超过9个字段。

我知道在某些版本的C中不允许使用变量初始化表,但对我来说这不是问题。所以,有谁知道问题的来源?

3 个答案:

答案 0 :(得分:2)

你的问题是你试图在9个字符的空间中存储9个字符和一个终端null;这不起作用。

- 1的计算中删除len,并确保字符串为空终止。

只是意外地使用固定长度阵列。

您还可以通过将printf()语句修改为:

来解决问题
printf("%.9s\n", ligne);

或:

printf("%.*s\n", len, ligne);

这不再需要以null结尾的字符串。

问题中的代码打印输出的上半部分,但在输出的下半部分反复打印相同的行。此代码修复了这一问题,使用min()内联函数确定要显示的最大增量。它还验证来自scanf()的返回值,以确保c中的值是合理的(1..26) - 如果不正确则默认失败。

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

static inline int min(int i, int j) { return (i < j) ? i : j; }

int main(void)
{
    int c;

    if (scanf("%d", &c) == 1 && c >= 1 && c <= 26)
    {
        int len = c*2-1;

        printf("%d\n", len);

        char ligne[len];

        for (int i = 0; i < len; i++)
        {
            int p = 0;
            int maxinc = min(len-1-i, i);
            for (int j = 0; j < c; j++)
            {
                ligne[len-1-j] = p + 'a';
                ligne[j] = p + 'a';
                if (p < maxinc)
                    p++;
            }
            printf("%.*s\n", len, ligne);
        }
    }

    return 0;
}

答案 1 :(得分:1)

您必须分配1 char个额外空格,并明确地向数组ligne添加NULL终止符。

char ligne[len + 1];

ligne[len] = '\0';

答案 2 :(得分:0)

char ligne[len+1];
for(int i=0;i<sizeof(ligne);++i)
    ligne[i]=0;