Любая причина, по которой это делает петли треугольной петли длиннее, чем необходимо

У меня есть эта функция, которая превратит массив символов (то есть строку) в прямоугольный треугольник. Он работает, но затем продолжает работать даже после остановки массива. Таким образом, вывод всегда содержит много лишних строк пробела.

и если слово достаточно длинное, в конце этого пробела появятся случайные символы. Вероятно, это связано с тем, что пустое пространство вышло за пределы массива размером 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()

person user3027779    schedule 01.02.2014    source источник
comment
Где определяется counter и какое значение оно имеет изначально?   -  person Filipe Gonçalves    schedule 02.02.2014
comment
только что отредактировал. У меня есть счетчик как c в моем фактическом коде. я изменил его на счетчик для всех вас при переполнении стека, но забыл изменить это, извините   -  person user3027779    schedule 02.02.2014
comment
Счетчик считает слишком далеко. Попробуйте заменить счетчик на j: stringArray[j]   -  person Kurt Pattyn    schedule 02.02.2014
comment
изменить counter++ на if(++counter == len) counter = 0;   -  person BLUEPIXY    schedule 02.02.2014


Ответы (2)


Это не правильно:

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

Вы не можете увеличивать счетчик так много раз. Из-за вложенных циклов counter будет получать доступ к позициям за пределами границ - вы увеличиваете его до конечного значения, равного O (n ^ 2) по отношению к длине строки.

person Filipe Gonçalves    schedule 01.02.2014
comment
Спасибо, я рад, что теперь знаю, в чем проблема. Но это единственное место, где я могу поставить счетчик, который позволяет правильно создать треугольник. Я пробовал его везде, и он показывает каждую букву несколько раз или не показывает вообще. Я даже пытался заменить его условным (c‹len)c++; Это предотвращает появление случайных символов, но все еще остается много лишнего места. - person user3027779; 02.02.2014

Рассмотрим следующий простой случай:

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

и так далее (однако, как только вы нажмете неопределенное поведение, все ставки сняты, и ваша программа будет бесплатной делать что хочет).

person NPE    schedule 01.02.2014