在打印语句注释掉的情况下运行为什么会得到不同的结果?

我正在为c学习一些在线课程,但结果却很奇怪。在下面的函数中,当我取消注释底部的printf语句时,将获得正确的答案。但是,当我在没有printf()的情况下运行函数时,会得到看似随机的结果。

我在另一个功能中打印出此结果。我收集到的信息可能与未使用垃圾值将数组定义为数组有关,但是接下来我将遍历并在循环中设置每个数组。

string ciphercalc(string text, string key)
{
    int length = strlen(text);
    char characters[length + 1];
    characters[length + 1] = '\0';

    for (int i = 0; i < 26; i++)
    {
        if (text[i] < 65 || (text[i] > 90 && text[i] < 97) || text[i] > 122 )
        {
            characters[i] = text[i];
        }
        else if (text[i] < 95)
        {
            if (key[i] < 95)
            {
                characters[i] = key[i];

            }
            else
            {
                characters[i] = key[i] - 32;
            }
        }
        else
        {
            if (key[i] > 95)
            {
                characters[i] = key[i];

            }
            else
            {
                characters[i] = key[i] + 32;
            }
        }
    }

    string endchar = characters;
    //printf("%s", endchar);
    return endchar;
}

谁能指出我正确的方向?