C 为什么超过44个字符时会打印随机符号

C 为什么超过44个字符时会打印随机符号,c,arrays,C,Arrays,我正在从一本书《C编程:现代方法》中学习C。现在我要做的是关于数组的练习。其中一个练习是编写一个过滤器,以不同的方式打印输入消息 到目前为止(见下面的代码),一切正常,直到字符数超过44,然后打印随机符号。如果字符数低于44,一切正常。我完全不知道它为什么会这样。问题在哪里?解决方案可能是什么 int i = 0, k = 0; char message[k],ch; printf("Enter a message: "); while(toupper(ch = getchar()) != '

我正在从一本书《C编程:现代方法》中学习C。现在我要做的是关于数组的练习。其中一个练习是编写一个过滤器,以不同的方式打印输入消息

到目前为止(见下面的代码),一切正常,直到字符数超过44,然后打印随机符号。如果字符数低于44,一切正常。我完全不知道它为什么会这样。问题在哪里?解决方案可能是什么

int i = 0, k = 0;
char message[k],ch;

printf("Enter a message: ");
while(toupper(ch = getchar()) != '\n')
{
    message[k] = ch;
    k++;
}
printf("In B1FF-speak: ");
for (i = 0; i <= k - 1; i++)
{
    switch(toupper(message[i]))
    {
        case 'A':
            printf("4");
            break;
        case 'B':
            printf("8");
            break;
        case 'E':
            printf("3");
            break;
        case 'I':
            printf("1");
            break;
        case 'O':
            printf("0");
            break;
        case 'S':
            printf("5");
            break;
        default:
            printf("%c", toupper(message[i]));
            break;
    }
}
inti=0,k=0;
字符消息[k],ch;
printf(“输入消息:”);
while(toupper(ch=getchar())!='\n')
{
消息[k]=ch;
k++;
}
printf(“用B1FF来说:”);
对于(i=0;i
您已经将
message
定义为可变长度数组(VLA)。(这是1990年版本C中不存在的功能;它是1999年标准添加的,2011年标准将其设置为可选。)

由于
k
的值为
0
,因此
消息的长度为
0
。C不支持零长度数组。定义长度为零的常量数组是非法的(约束冲突,需要诊断)。定义长度为零的可变长度数组具有未定义的行为

VLA的长度在定义时是固定的。以后更改
k
的值不会更改数组的长度。您的代码似乎认为它会更改

您的程序似乎可以工作长达44秒。这是未定义行为的本质。可能发生的最糟糕的事情是,您的程序似乎工作“正确”;这只意味着您有一个难以检测的bug


如果您想在一个数组中存储任意多个元素,您可以首先用足够大的大小来定义它(很难或不可能确定它必须有多大),或者可以使用
realloc()
动态分配数组并根据需要展开它。(
realloc()
实际上并不扩展数组;它创建一个更大的新数组,并将旧数组的内容复制到新数组中。如果没有足够的可用内存,它可能会失败;始终检查它返回的值以确定它是成功还是失败。)

char message[k]
k
设置为0?这是一个严肃的问题吗???@潜伏者:
char message[k]
where
k==0
有未定义的行为。@barakmanos:OP显然认为更改
k
的值会改变数组的长度。这不是一个完全不合理的假设;只是碰巧是不正确的。@KeithThompson好的,明白了。但在这两种情况下都是个坏主意。@KeithThompson:Yep,我现在明白了。Som有时,为了解释主题的错误,理解主题的思维方式本身就是一项具有挑战性的任务(您似乎已经很好地处理了这项任务)。我想,多年的编程让我的“超越边界”的能力变成了其他认知(我现在明白你的意思了,如果我可以补充一点的话,这是一种自然的感觉)-有点直截了当。附言:很有趣,显而易见的事情有时会让你逃避。
int i = 0, k = 0;
char message[k],ch;