我需要创建一个打印以下输出的控制台程序:
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中不允许使用变量初始化表,但对我来说这不是问题。所以,有谁知道问题的来源?
答案 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;