-1

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

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 中不允许使用变量初始化表,但这对我来说不是问题。那么,有谁知道问题来自哪里?

4

3 回答 3

2

您的问题是您试图将 9 个字符加上一个终端 null 存储到 9 个字符的空间中;这不起作用。

- 1从您的计算中删除len并确保字符串以空值结尾。

它只是偶然地与固定长度数组一起工作。

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

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

或者:

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

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

问题中的代码打印输出的上半部分,但在输出的下半部分一遍又一遍地打印同一行。此代码修复了该问题,使用min()内联函数来确定要显示的最大增量。它还验证 from 的返回值,scanf()以确保 in 的值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;
}
于 2013-07-17T23:32:51.827 回答
1

您必须分配 1 个char额外空间并明确地将 NULL 终止符添加到数组ligne中。

char ligne[len + 1];

ligne[len] = '\0';
于 2013-07-17T23:32:16.507 回答
0
char ligne[len+1];
for(int i=0;i<sizeof(ligne);++i)
    ligne[i]=0;
于 2013-07-17T23:34:27.030 回答