繁体   English   中英

将字符存储在字符指针中

[英]store characters in character pointer

我有一个线程,一个接一个地解析传入的字符/字节。 我想将字节序列存储在字节指针中,最后,当找到“ \\ r \\ n”序列时,应该将完整的消息打印出来。

unsigned char byte;
unsigned char *bytes = NULL;

while (true){              // thread which is running on the side
    byte = get();          // gets 1 byte from I/O
    bytes = byte;          //
    *bytes++;
    if (byte == 'x'){      // for now instead of "\r\n" i use the char 'x'
        printf( "Your message: %s", bytes);
        bytes = NULL;        //  or {0}?
    }
}

您应该将bytes定义为最大消息长度为大小的数组,而不是指针。

unsigned char byte, i;
unsigned char arr[10];   // 10 for example
i=0;
while (true){              
    byte = get();          
    arr[i] = byte;       
    i++;
    if (byte == 'x'){      
        printf( "Your message: %s", arr);
    }
}

当您将bytes定义为指针时,它不指向任何东西,对其进行写操作可能会擦除程序中的其他数据,您可以使用malloc将其设置为数组或在运行时为其分配空间

您的密码

unsigned char byte;
unsigned char *bytes = NULL;

while (true){              

这里没有问题 ,但必须清除一些事项:

    1. 您是否为bytes缓冲区分配了内存 也就是说,使用malloc()系列函数吗?
    1. 如果是这样,您是否检查过 malloc()返回并确保指针正常?
    1. 您是否包含stdbool.h来使用truefalse

继续...

byte = get();         
bytes = byte;          
*bytes++;
    1. 假设 get()返回一个unsigned char ,因为您没有给出代码。
    1. 问题bytes = byte 您正在将unsigned char分配给unsigned char unsigned char * 这很糟糕,因为unsigned char *期望有一个内存地址 (又称指针 ),并且您给它一个字符 (这会转换成一个非常糟糕的内存地址 ,导致您要提供的地址最多为255,这是您的程序所不允许的)进行访问),并且您的编译器肯定抱怨该分配...
    1. *byte++有两个“问题”(不是真正的问题): 一个 ,您不需要* (解引用)运算符就可以增加指针引用 ,就可以做到byte++ 第二 ,如果您将这一行和前一行( bytes = byte )切换为*bytes++ = byte则更容易理解。 如果您不知道该语句的作用,建议您阅读运算符优先级赋值运算符

那我们有...

if (byte == 'x'){      
    printf( "Your message: %s", bytes);
    bytes = NULL;      
}
    1. if还好。
    1. printf()被弄乱了,因为在get()这些字符的整个过程中一直在增加 bytes指针。 这意味着由bytes指向的当前位置是字符串 (或message )的末尾 要解决此问题,您可以执行以下两项操作之一: 一是在读取的字节数上设置一个计数器,然后使用该计数器减少bytes指针并获取正确的地址; 两个 ,使用辅助辅助指针 (我更喜欢,因为它更容易理解)。
    1. bytes = NULL 如果bytes缓冲区执行 malloc() ,则此处将销毁该引用,因为要进行赋值可以有效地将指针指向 的地址更改NULL 无论如何,您需要清除该缓冲区的是memset() 阅读手册中的更多内容。
    1. 另一个细微 (但很严重)的问题是字符串字符的结尾 ,您忘记将其完全放在该字符串中。 没有它, printf()将开始在消息之前打印真正奇怪的东西,直到出现Segmentation Fault之类的错误 为此,您可以使用已经递增的 bytes指针,并执行*bytes = 0x0*bytes = '\\0' 字符串中使用NULL终止字节 ,以便函数知道字符串的结尾。 没有它,将很难操纵字符串。

    unsigned char byte;
    unsigned char *bytes = NULL;
    unsigned char *bytes_aux;


    bytes = malloc(500);
    if (!bytes) return;
    bytes_aux = bytes;

    while (true) {  /* could use while(1)... */
        byte = get();
        *bytes++ = byte;
        if (byte == 'x') {
            *(bytes - 1) = 0x0;
            bytes = bytes_aux;
            printf("Your message: %s\n", bytes);
            memset(bytes, 0, 500);
        }
    }
    1. if ((*bytes++ = get()) == 'x')是三个byte = get(); *bytes++ = byte; if (byte == 'x')的复合版本byte = get(); *bytes++ = byte; if (byte == 'x') byte = get(); *bytes++ = byte; if (byte == 'x') byte = get(); *bytes++ = byte; if (byte == 'x') 请参阅我告诉过您的作业链接! 这是一种整齐的书写方式,会让您在聚会上看起来超酷!
    1. *(bytes - 1) = 0x0; -1位用于排除保存在字符串中的x字符。 第一步,排除x 设置NULL终止字节
    1. bytes = bytes_aux; 这将恢复bytes默认状态-现在它正确指向消息开头
    1. memset(bytes, 0, 500)我告诉过您的有关重置字符串的函数。
    1. 这种特殊情况下,不必使用memset 每次循环重复,我们从bytes缓冲区的开始一直保存字符。 然后,我们设置一个NULL终止字节并恢复其原始位置,从而有效地覆盖所有其他数据。 NULL字节将防止printf()打印当前消息结束后的内容。 因此,可以跳过memset()部分并节省宝贵的CPU时间!
    1. 当您离开该循环的某个位置时(如果这样做),请记住要free() bytes指针! 您不希望内存泄漏...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM