这种“制作三角形循环”循环的时间长于必要的时间

时间:2014-02-01 23:27:19

标签: c arrays string c-strings

我有这个函数将一个字符数组(即一个字符串)变成一个直角三角形。它工作,但它甚至在阵列停止后继续运行。所以输出总是有很多额外的空白行。

如果单词足够长,随机符号将出现在该空格的末尾。这可能是因为空白区域退出了100的数组大小。 我不知道是什么造成的。我试图为计数器和printf设置一个新行,但这完全打破了代码。我认为这对于新线路来说绝对是printf,但是在尝试之后看起来并不像现在这样。 有谁看到什么错了?

以下是我的代码中的远程功能。

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


#define clear system("cls") 
#define pause system("pause") 


void triangulate(char stringArray[]){
    int i,j,len = 0;
    int counter=0;
    len=strlen(stringArray);//a function library function that returns the length

    printf("\n");
    for(i=1;i<=len;++i){
        for(j=1;j<=i;++j){
            printf("%c",stringArray[counter]);
            counter++;
        }
        printf("\n");

    }
    printf("len:%i counter:%i",len, counter);
    pause;
}//end triangulate()

2 个答案:

答案 0 :(得分:1)

这是错误的:

for(i=1;i<=len;++i) {
    for(j=1;j<=i;++j) {
        printf("%c",stringArray[counter]);
        counter++;
    }
    printf("\n");
}

你不能多次增加计数器。由于嵌套循环,counter将访问越界位置 - 您将其递增到与字符串长度相关的最终值O(n ^ 2)。

答案 1 :(得分:0)

让我们考虑以下简单案例:

stringArray = "abc";

看看两个循环中会发生什么:

i = 1; j = 1; counter = 0;
i = 2; j = 1; counter = 1;
i = 2; j = 2; counter = 2;
i = 3; j = 1; counter = 3; // Undefined behaviour since stringArray[counter]
                           // is out of bounds

依此类推(但是,一旦你点击undefined behaviour,所有的赌注都会关闭,你的程序可以自由地做任何想做的事。)