在C编程 - 绝对初学者指南第18章,示例2中,程序写入
#include <stdio.h>
#include <stdlib.h>
main ()
{
int i;
char msg[25];
printf("Type up to 25 characters and then press Enter...\n");
for (i = 0; i < 25; i++)
{
msg[i] = getchar();
if (msg[i] == '\n')
{
i--;
break;
}
}
putchar('\n');
for (; i >= 0; i--)
{
putchar(msg[i]);
}
putchar('\n');
return 0;
}
我对该计划有2个问题。
msg分配了一个包含25个字符的数组,printf告诉用户最多输入25个字符。难道不应该为msg分配一个包含26个字符的数组来容纳反斜杠零点吗?
当for循环写成这样:for(; i&gt; = 0; i--),起始表达式是什么?
答案 0 :(得分:1)
不,因为这不是一个c字符串而且你知道数组的大小,恰好是25,并且可以容纳25个元素。
for循环中没有定义任何内容。我们使用在main开头定义的变量i
,它保存的值是我们输入字符时得到的值。
答案 1 :(得分:0)
你是对的,字符串需要一个字节用于终结符。
但该程序从不将其视为字符串,因此这是一个没有实际意义的点。
没有。
C for循环中的所有表达式都不是强制性的。
作为一个案例,即惯用无限循环:
for(;;) /* Do things */;
答案 2 :(得分:0)
FWIW,如果用户在按Enter键之前输入超过25个字符,则此程序中存在错误。在这种情况下,第一个for
循环以i
的值等于25
结束。在第二个for
循环中,您最终将访问正在访问msg[25]
越界的msg
。
i
应在for
循环后递减,而不是在if (msg[i] == '\n')
块内。
for (i = 0; i < 25; i++)
{
msg[i] = getchar();
if (msg[i] == '\n')
{
break;
}
}
i--;