c - 如何在 Linux 中删除 ^M ^J 字符

标签 c newline codeblocks raspberry-pi raspbian

我有一台外部机器,可以将结果发送到我的 Raspberry pi 中。在我的模拟器 Cutecom 中,我逐行得到结果,没有问题。我使用 Codeblocks 并编写了自己的 C 应用程序,每 10 秒读取一次这些数据。但是奇怪的事情发生了。有时我一行一行地得到结果,有时我在每行的末尾都有奇怪的字符 ^M ^J,结果我的最终结果很糟糕。我认为这些EOF字符是因为外机已经在Windows开发了。

好的结果

+PARAMETERS: 45 BYTES FROM 0000:0000 (063)
MACHINE_1:(AN=23.45,H=34.56,D=12.34)

不好的结果

+PARAMETERS: 45 BYTES FROM 0000:0000 (063)^M^JMACHINE_1:
(AN=21.45,H=33.56,D=10.34)

好的,直到这里唯一的问题是命令行显示结果的方式,但我的结果还可以。但是,如果我尝试使用 strtok 获取一些标记,那么由于这些字符,我会遇到严重的问题。我能做些什么?我可以添加一些东西来转义这些字符吗?这是我用来从机器读取数据的代码的一部分

char buff[300];
memset(buff, 0, sizeof(buff));
for (;;)
{
  n=read(fd,buff,sizeof(buff));
  sleep(1);
  printf("%s", buff);
  printf("\n");
  ....
  ....

最佳答案

您只是读取 300 个字符的 block ,因此没有字符串终止 \0

您必须查看 n 以查看您读取了多少数据,然后在打印数据之前处理数据,即查找 ^J^M 和终止该行,然后继续读取其余数据。

仅供引用 ^J^M 是 Windows 行终止(它只是 ^J 形式的 linux)

下面应该读取多条消息并将 ^ 和 J 转换为\n 并忽略 ^M。

请注意,这里使用的是 STDIN,而不是串行端口。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int fd=STDIN_FILENO;
    int i,n;
    int c=0;

    char buff[300];
    memset(buff, 0, sizeof(buff));
    for (;;)
    {
        n=read(fd,buff,sizeof(buff));
        for (i=0; i<n; i++) 
        {
            switch(buff[i])
            {
            case '^':
                if(c) 
                {
                    // ^^ so output first ^
                    putchar('^');
                }
                else
                {
                    // Possible ^M or ^J
                    c++;
                }
                break;

            case 'M':
                if (c)
                {
                    // ignore ^M
                    c=0;
                }
                else
                {
                    // just M 
                    putchar(buff[i]);
                }
                break;

            case 'J':
                if (c)
                {
                    // ^J is \n
                    putchar('\n');
                    c=0;
                }
                else 
                {
                    // just J
                    putchar(buff[i]);
                }
                break;

            default:
                if (c)
                {
                    // ^ followed by other than J or M
                    putchar('^');
                    c=0;
                }

                putchar(buff[i]);
            }
        }

    }
    return 0;
}

关于c - 如何在 Linux 中删除 ^M ^J 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977985/

相关文章:

objective-c - 在 Objective C 中从源文件创建 .dylib 动态库

c - 多线程和缓存非同时使用内存

Python 3.x C API : Do I have to free the memory after extracting a string from a PyObject?

c++ - 如何使用 Code::Blocks 或 MinGW 在 Windows 上构建 CPP-NETLIB 库

c++ - makefile 或代码块 TO eclipse on ubuntu

c - 如何从 Windows 内核获取电池电量级别的通知?

javascript - 如何计算javascript中字符串中的空行

swift - Swift 中的转义字符

Java Formatter 不允许换行符?

c - 从函数返回结构