簡體   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