解决C中的意外字符串行为

时间:2015-01-22 20:42:29

标签: c string type-conversion

我正在编写一些简单的C程序来学习这门语言,到目前为止我认为我已经开始掌握基础知识,但我遇到了一个我不理解的奇怪行为。有人能告诉我这里出了什么问题以及如何解决它?

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

int main() {
    const unsigned int MAX_LENGTH = 20;
    char str[MAX_LENGTH];
    unsigned int len = 0, i, j;

    for (i = 0; i < MAX_LENGTH; i++) {
        str[i] = getchar();

        if (strncmp(&str[i], "\n", 1) == 0) {
            break;
        }

        len++;
    }

    for (i = 1; i < len; i++) {
        char whitespace[len];

        for (j = 0; j < i; j++) {
            whitespace[j] = ' ';
        }

        printf("%s%c\n", whitespace, str[i]);
    }

    return 0;
}

我输入&#34; Hello World!&#34;作为循环getchar()方法的输入,我希望控制台看起来像这样:

Hello World!
 e
  l
   l
    o

      W
       o
        r
         l
          d
           !

但相反,我得到了这个胡言乱语:

Hello World!
 ;oQ?e
  oQ?l
   Q?l
    ?o

      W
       o
        X?Pr
         ?Pl
          Pd
           !

1 个答案:

答案 0 :(得分:2)

whitespace数组未终止。

for循环之后添加一个空终止符,如

for (j = 0; j < i; j++) {
        whitespace[j] = ' ';
    }
whitespace[j] = `\0`;