簡體   English   中英

Int to char array 作為一個函數,以簡單的方式返回一個 char 數組

[英]Int to char array as a function returning an array of char the simple way

我一直在互聯網上尋找這個問題,到目前為止,我只找到了很多具體答案的問題,而不是一般問題。

我對 C 有點生疏。我想制作一個返回字符數組的函數。

這就是我得到的並且不起作用。 基本上是一種將字節數組轉換為字符數組以稍后執行 atoi 的方法。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *get_char(int my_byte[], int packetsize)
{
    char *array_char=(char *) malloc(sizeof(char)*10);  //trying this but didnt work
     // char array_char[10]; //i had it like this before(was told to do it)

        for(int i=0;i<10;i++)
        {
            array_char[i]=my_byte[i]+0;
        }           

        return array_char;
    }

int main()
{

    int byte_array[]={1,2,3,4,5,6,7,8,9,0};
    char *temp;
    char data;

    temp=get_char(byte_array,10);   
    data=*temp;
    printf("String  point %s ",data);

}

兩個修復:

  • 當你想轉換為字符時,那么

array_char[i]=my_byte[i]+0; 應該是array_char[i]=my_byte[i]+'0'; 注意'0'是字符(將被轉換為 int)而不是數字 0(它不做任何事情)。

  • 此外,您必須在main釋放temp指針,因為該內存是在get_char()函數中動態分配的。

編輯:請注意get_char()另一個問題

char *array_char=(char *) malloc(sizeof(char)*10);

應該

char *array_char= malloc(sizeof(char)*(packetsize+1));

for循環之后,確保緩沖區以 NUL 結尾:

array_char[packetsize] = '\0';

請注意,您的packetsize從未使用過-你應該得到一些關於它的編譯器警告。 在您的malloc硬編碼10是不好的 - 這實際上是將packetsize解析為參數的整個想法 - 所以請正確使用它。

你需要注意以下幾點:

  • 您需要在*array_char的末尾添加一個空終止字符,否則使用從堆分配的這個指針將導致未定義行為
  • 您可以像這樣簡單地分配*array_char

     char *array_char = malloc(packetsize+1);

    因為sizeof(char)1 ,並且+1用於尾隨空字節。

  • 您也不需要轉換malloc() 的返回值

  • 而不是將10作為packetsize傳遞給get_char() ,您應該將此大小作為sizeof(arr) / sizeof(arr[0] ,這是數組的計算大小。這可以是在某處聲明的size_t變量,甚至是宏.
  • malloc()需要檢查,因為如果不成功它可以返回NULL
  • 您需要在程序中的某個時刻free() temp
  • array_char[i]=my_byte[i]+0; 需要是array_char[i]=my_byte[i]+'0'; 相反,因為'0'是零字符的 ascii 代碼。

  • char data需要是char *data ,因為temp是一個指針。

    如果你用-Wall -Wextra編譯,你會看到這一行:

     data=*temp;

    很危險,並且會觸發警告,提示從整數創建指針而不進行強制轉換。 它很可能會導致分段錯誤。 如果tempdata都是指針,那么您可以簡單地使用:

     data=temp;

    它將data設置為temp的地址。 有時這寫成data = &(*temp); ,但這更難閱讀。 雖然他們不需要data ,單獨使用temp應該沒問題。

您的代碼可能如下所示:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))

char *get_char(int my_byte[], size_t packetsize) {
    char *array_char = malloc(packetsize+1);
    const char ascii = '0';
    size_t i;  

    if (!array_char) {
        printf("Cannot allocate %zu bytes\n", packetsize+1);
        exit(EXIT_FAILURE);
    }

    for(i = 0; i < packetsize; i++) {
        array_char[i] = my_byte[i] + ascii;
    }
    array_char[i] = '\0'; /* or array_char[packetsize] = '\0' */           

    return array_char;
}

int main(void) {
    int byte_array[]={1,2,3,4,5,6,7,8,9,0};
    char *temp, *data;

    temp = get_char(byte_array, ARRAYSIZE(byte_array));  
    data = temp;
    printf("String  point %s\n", data);

    printf("String converted into number = %d\n", atoi(data));

    free(temp);
    temp = NULL;

    return 0;
}

您還可以查看strtol ,它在錯誤檢查方面比使用atoi()更好。

從函數返回數組不是明智的想法。 那么如何返回一個字符串呢? 由於大多數 libc 函數使用我們可以使用類似的東西(即)將緩沖區與我們的輸入一起傳遞,並期望函數使用輸出緩沖區為我們提供結果。

編碼時需要注意的一些問題

  1. 先寫你的邏輯。
  2. 嘗試使用 libc 中的可用函數。
  3. 在處理字節數據/二進制數據時,請注意緩沖區溢出。
  4. 不要在一個函數中分配並在另一個函數中取消分配。

以下是經過修改的代碼示例。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <stdint.h>

int get_char(uint8_t my_byte[], int packetsize, char *buffer, int max_buffer)
{
        int byte_itr, buf_itr;
        char temp_buf[16]={0x00};
        for(byte_itr=0, buf_itr=0; byte_itr<packetsize && max_buffer > buf_itr; byte_itr++)
        {
                memset(temp_buf, 0x00, sizeof(temp_buf));
                char temp_ch = my_byte[byte_itr];
                snprintf(temp_buf, sizeof(temp_buf), "%d", temp_ch);
                if( buf_itr+strlen(temp_buf) >=max_buffer){
                        break;
                }else{
                        buf_itr += strlen(temp_buf);
                        strcat(buffer, temp_buf);
                        if(byte_itr+1 < packetsize){
                                strcat(buffer, ",");
                                buf_itr += 1;
                        }
                }
        }

        return buf_itr;
}

int main()
{
        uint8_t byte_array[]={1,2,3,4,5,6,7,8,9,0};
        char char_array[32]={0x00};
        int len = get_char(byte_array, 10, char_array, sizeof(char_array));
        printf("String  point %s : len %d\n", char_array, len);

}

注意:當長度返回和輸出緩沖區的大小相同時,緩沖區已滿情況發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM