我正在从《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;
}
}
int i = 0, k = 0;
char message[k],ch;
你已经定义了message
as a 变长数组(VLA)。 (这是 1990 年版本的 C 中不存在的功能;它是由 1999 年标准添加的,并在 2011 年标准中成为可选的。)
由于值k
is 0
,长度message
is 0
。 C 不支持零长度数组。定义常量长度为零的数组是非法的(违反约束,需要诊断)。定义长度为零的可变长度数组具有未定义的行为。
VLA 的长度在定义时是固定的。改变值k
稍后不会更改数组的长度。您的代码似乎假设它会。
你的程序seems工作长度可达 44。这就是未定义行为的本质。这worst可能发生的事情是你的程序似乎“正确”工作;这只是意味着您有一个难以检测的错误。
如果您想在数组中存储任意多个元素,您可以首先将其定义为足够大的大小(可能很难或不可能确定它必须有多大),或者您可以使用realloc()
动态分配数组并根据需要扩展它。 (realloc()
实际上并没有扩展数组;它创建一个更大大小的新数组,并将旧数组的内容复制到新数组中。如果没有足够的可用内存,它可能会失败;始终检查它返回的值以确定它是成功还是失败。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)