[英]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){
这里没有问题 ,但必须清除一些事项:
bytes
缓冲区分配了内存 ? 也就是说,使用malloc()
系列函数吗? malloc()
返回并确保指针正常? stdbool.h
来使用true
和false
? 继续...
byte = get();
bytes = byte;
*bytes++;
get()
返回一个unsigned char
,因为您没有给出代码。 bytes = byte
。 您正在将unsigned char
分配给unsigned char
unsigned char *
。 这很糟糕,因为unsigned char *
期望有一个内存地址 (又称指针 ),并且您给它一个字符 (这会转换成一个非常糟糕的内存地址 ,导致您要提供的地址最多为255,这是您的程序所不允许的)进行访问),并且您的编译器肯定抱怨该分配... 那我们有...
if (byte == 'x'){
printf( "Your message: %s", bytes);
bytes = NULL;
}
if
还好。 printf()
被弄乱了,因为在get()
这些字符的整个过程中一直在增加 bytes
指针。 这意味着由bytes
指向的当前位置是字符串 (或message )的末尾 。 要解决此问题,您可以执行以下两项操作之一: 一是在读取的字节数上设置一个计数器,然后使用该计数器减少bytes
指针并获取正确的地址; 或两个 ,使用辅助辅助指针 (我更喜欢,因为它更容易理解)。 bytes = NULL
。 如果对bytes
缓冲区执行了 malloc()
,则此处将销毁该引用,因为要进行赋值可以有效地将指针指向 的地址更改为NULL 。 无论如何,您需要清除该缓冲区的是memset()
。 阅读手册中的更多内容。 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);
}
}
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')
。 请参阅我告诉过您的作业链接! 这是一种整齐的书写方式,会让您在聚会上看起来超酷! *(bytes - 1) = 0x0;
-1
位用于排除保存在字符串中的x
字符。 第一步,排除x
并设置NULL终止字节 。 bytes = bytes_aux;
这将恢复bytes
默认状态-现在它正确指向消息的开头 。 memset(bytes, 0, 500)
我告诉过您的有关重置字符串的函数。 memset
。 每次循环重复,我们从bytes
缓冲区的开始一直保存字符。 然后,我们设置一个NULL终止字节并恢复其原始位置,从而有效地覆盖所有其他数据。 NULL字节将防止printf()
打印当前消息结束后的内容。 因此,可以跳过memset()
部分并节省宝贵的CPU时间! free()
bytes
指针! 您不希望内存泄漏...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.