关于C编程中的程序的2个问题 - 绝对初学者指南

时间:2014-11-18 03:15:26

标签: c arrays for-loop

在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个问题。

  1. msg分配了一个包含25个字符的数组,printf告诉用户最多输入25个字符。难道不应该为msg分配一个包含26个字符的数组来容纳反斜杠零点吗?

  2. 当for循环写成这样:for(; i&gt; = 0; i--),起始表达式是什么?

3 个答案:

答案 0 :(得分:1)

  1. 不,因为这不是一个c字符串而且你知道数组的大小,恰好是25,并且可以容纳25个元素。

  2. for循环中没有定义任何内容。我们使用在main开头定义的变量i,它保存的值是我们输入字符时得到的值。

答案 1 :(得分:0)

  1. 你是对的,字符串需要一个字节用于终结符。

    但该程序从不将其视为字符串,因此这是一个没有实际意义的点。

  2. 没有。

    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--;