【问题标题】:2 questions regarding program in C Programming - Absolute Beginner's Guide关于 C 编程中程序的 2 个问题 - 绝对初学者指南
【发布时间】:2014-11-18 03:15:26
【问题描述】:

在 C Programming - Absolute Beginner's Guide 第 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 >= 0;i--)时,起始表达式是什么?

【问题讨论】:

    标签: c arrays for-loop


    【解决方案1】:
    1. 不,因为这不是 c 字符串,而且您知道数组的大小,恰好是 25,可以容纳 25 个元素。

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

    【讨论】:

    • 感谢您的回复。 c字符串,你的意思是字符串数据类型吗?我知道它可以容纳 25 个元素,但不应该使用其中一个来容纳反斜杠零吗?如果 printf 要求用户输入最多 25 个字符的消息,则反斜杠零没有空格。
    • @freesushi c-string 我的意思是一个以空字符结尾的数组字符。零不需要空间,因为您事先知道数组 (25) 的大小,而且您没有存储 c 字符串。
    【解决方案2】:
    1. 你说得对,一个字符串需要多一个字节作为终止符。

      但程序从不将其视为字符串,所以这是一个没有实际意义的问题。

    2. 没有。

      C for 循环中的所有表达式都不是强制性的。

      举个例子,惯用的无限循环:

      for(;;) /* Do things */;
      

    【讨论】:

    • 我明白了。感谢您的回复!
    【解决方案3】:

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

    【讨论】:

    • 我在我的设备中试用了您的版本,这对我来说很有意义。感谢你的回复!但我不明白你的意思是“你最终将访问 msg[25],它正在访问 msg 越界”为什么当我在我的 msg 数组中分配 25 个空格时 msg[25] 越界?
    • 当数组大小为N 时,有效索引为0 到N-1。
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2010-12-21
    • 2010-09-06
    • 2012-07-20
    • 2010-09-23
    • 1970-01-01
    • 2011-05-15
    • 2012-02-10
    相关资源
    最近更新 更多