【问题标题】:K&R exercise 1-23K&R 练习 1-23
【发布时间】:2015-06-21 03:07:29
【问题描述】:

我有两个与题名练习相关的问题,来自 The C Programming Language。我确信他们之前都已经得到了回答,所以直接回答或链接到以前的帖子(我找不到任何帖子)将不胜感激。

练习本身是编写一个从 C 代码中删除 cmets 的 C 程序。

  1. 我见过很多这个程序的例子,但我不知道如何测试它。他们都使用 getchar() 来“获取”他们要编辑的代码,但我不知道如何告诉程序读取另一个文件,而不是只等待来自命令行的输入。我试过“./a.out program_to_edit.c”,但没有奏效。或者,如果有一种简单的方法可以像在其他语言中那样从文本块(而不是一次一个字符)中创建一个字符串,那也可以。

  2. 这个问题有点笼统。使用 getchar() 读取 C 源代码时,我对转义字符的工作方式感到困惑。如果我在 TextEdit 中查看 .c 文件,我会看到“\t”,但如果我编译它并打印出来,它会以制表符的形式出现。这是否意味着 .c 文件包含 '\\' 和 't' 并且编译器将它们组合在一起,还是完全不同?如果我使用 getchar() 读取该文件,它会返回什么?

谢谢。

【问题讨论】:

标签: c stdio kernighan-and-ritchie


【解决方案1】:

对于问题的第一部分,您阅读了类似这样的文件。 你应该在“The Book”中找到这方面的例子。

#include <stdio.h>

int main(void)
{
    FILE *fp = fopen("Some_file.txt","rt");
    if (fp != NULL)
    {
        int c = fgetc(fp);
        while (c != EOF)
        {
            /* Do something with c */
        }

        fclose(fp);
    }
    else
    {
        printf("Can't open the file?\n");
    }

    return 0;
}

对于您问题的第二部分,反斜杠表示反斜杠和下一个字符被替换为某些内容。

  • /t 被 (char) 9 替换,这是 ascii 制表符。
  • /a 被 (char) 7 替换,这是一个可听见的铃声
  • /n 在 unix 系统上被 (char) 10 取代,在 dos 系统上被 (char)13, (char) 10 取代。

做一些重读。 它在“书”中。

欢迎来到 Stack Overflow。

【讨论】:

  • 感谢您的全面回答。奇怪的是,在分配这个练习之前,这本书没有涵盖文件输入。我没想过要提前阅读,但好主意。至于第二部分,我还不够清楚。我知道转义字符是什么,我只是不知道从 .c 文件中读取“\t”的 getchar() 是否会返回一个转义的反斜杠然后返回一个“t”,或者它是否会返回一个实际的制表符字符。
  • 啊。从文件中它将是两个字符。阅读反斜杠,然后阅读 t。
【解决方案2】:
  1. 重定向标准输入:./a.out &lt; program_to_edit
  2. 转义表示仅存在于源代码中。编译器将它们转换为适当的字符。

【讨论】:

  • 谢谢。为了澄清问题二,我的意思是我很困惑这样一个事实,即在 .c 文件中可以有实际的换行符和制表符等,但你也可以有两个字符的转义序列,它们将被转换为他们在编译时。如果您使用 getchar() 读取 .c 文件,实际的换行符显然会返回一个换行符,但转义的反斜杠后跟一个 'n' 也会这样做吗?
  • '\' 和 'n' 等序列的存在只是为了让您以舒适的方式编写特殊字符。 '\n'10 这两种可能的表示形式被编译器平等对待。
  • 没关系,回答我自己的问题。 getchar() 将它们读取为 '\\' 后跟 'n'。
  • 绝对不是。 getchar() 返回值 10。请参阅我之前的评论。
  • 我刚刚测试了它,我很确定它确实如此。我的意思是,如果您传递一个包含文本“printf("hi\n");”的文件对于使用 getchar() 逐个字符打印出文件的程序,它将打印出“\n”,而不是用 printf 将在调用方法本身时生成的返回字符替换这两个字符。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多