gpt4 book ai didi

c - 读取文件时 getchar/putchar 出现意外返回值 ^M

转载 作者:行者123 更新时间:2023-11-30 19:37:18 24 4
gpt4 key购买 nike

我正在使用 getchar 和 putchar(来自 Ritchie C 书)处理文本格式。我能够消除“//”注释,但在删除空白行上的一些换行符时遇到问题。我想从源文件中删除行注释“//”和“blanK”换行符(没有任何文本的行)。

我在输出文件中收到奇怪的 ^M 字符。

似乎检查前一个 char (pre) 和当前 char c 是否均为 '\n' 的 if else 语句正在创建错误。

如果删除它,它将不再提供奇怪的输出:

else if(c == '\n' && pre == '\n')
{
pre = c;
}

完整代码如下:

#include <stdio.h>
#include <string.h>
#include <ctype.h>


main()
{
int c;
int pre;
int comment = 0;

while ((c = getchar()) != EOF)
{
// printf("%c", c);
// printf("pre is %c comment is %d c is %c\n", pre, comment, c);
// check to see if we're at a newline and set comment toggle to 0
if(c == '\n' && comment ==1)
{
comment = 0;
pre = c;
}
else if(c == '\n' && pre == '\n')
{
pre = c;
}
else if(comment == 1)
{
pre = c;
}
else if(pre == '/' && c == '/')
{
comment = 1;
pre = c;
}
else if(c == '/')
{
pre = c;
}
else if(pre =='/')
{
putchar(pre);
putchar(c);
pre = c;
}
else
putchar(c);
}
return 0;
}

输入文件是Add.asm。

// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/06/add/Add.asm

// Computes R0 = 2 + 3 (R0 refers to RAM[0])

@2
D=A
@3
D=D+A
@0
M=D

输出文件是 bdd.hack,它在 github 上看起来很好,但是当我用 vim 打开时,它看起来像这样:

^M^M@2^MD=A^M@3^MD=D+A^M@0^MM=D

C程序是assembler.c。我在命令行上这样调用它cc 汇编程序.c./a.out bdd.hack

github repo with input file Add.asm, output file bdd.hack, and program to format text assembler.c

注意:这是一个从 NAND 到俄罗斯方 block 的自学类(class) - 我正在用 C b/c 编写此内容,我正在学习 C,并认为这将是一个用 C(基本汇编器)完成的有趣项目。您可以忽略 assembler.c 底部的伪代码。

最佳答案

这是一个 Windows 文本文件,因此具有 ^M 字符,如上面 TonyB 所建议的。我在 debian 系统上使用 dos2unix 正确格式化文件,问题得到解决。谢谢大家的帮助!

关于c - 读取文件时 getchar/putchar 出现意外返回值 ^M,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com