[英]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;
很危險,並且會觸發警告,提示從整數創建指針而不進行強制轉換。 它很可能會導致分段錯誤。 如果temp
和data
都是指針,那么您可以簡單地使用:
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 函數使用我們可以使用類似的東西(即)將緩沖區與我們的輸入一起傳遞,並期望函數使用輸出緩沖區為我們提供結果。
編碼時需要注意的一些問題
以下是經過修改的代碼示例。
#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.