2013-07-17 99 views
-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的某些版本中不允许用变量初始化表,但这对我来说不是问题。那么,有没有人知道该从哪里来?

+1

BTW是你的程序给正确的输出 - 因为我没有得到 – exexzian

+0

程序产生正确的表的上半部分;它不能正确再现下半部分。 –

回答

1

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

char ligne[len + 1]; 

ligne[len] = '\0'; 
+0

已经尝试过,毫无意义。 – Mundus

+0

嗯,我在发布之前测试过它,它正在工作。在你的结局中必须有其他问题。 – sgarizvi

+0

最后,它工作 – Mundus

2

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

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

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

你也可以通过修改printf()声明来解决这个问题:

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

或:

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

这并不需要一个空终止字符串了。

问题中的代码打印输出的上半部分,但在输出的下半部分一遍又一遍地打印同一行。此代码修复了这一问题,使用内联函数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; 
} 
+0

我试图在发布之前为空添加空间,但它没用。 – Mundus

+4

仅仅说它没用就不好。你可能“修复”它错了。发布您认为正确的代码,但哪些仍不起作用。 –

+0

好吧,我换了“char ligne [len];”由“char ligne [len + 1];”,并没有奏效。但是printf技术很好。 – Mundus

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

已经尝试过,毫无意义。 – Mundus