[英]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.