将字符串转换为整数数组c
我是这个主题的新手。 我想将整数数组转换为字符串。然后将字符串转换为整型数组,以检查是否获得相同的输入。将字符串转换为整数数组c
gint16 frame[5] = {10, 2, 3, 7, 5};
char *str = malloc(sizeof(char) * (sizeof(frame)+1));
char *strp = str;
size_t j;
for (j= 0; j < sizeof(frame); j++) {
snprintf(strp, 4, "%02x", frame[j]); //hexadecimal
strp++;
}
// from hexa string to 16 bit integer array
gint16 n_oframe[5];
size_t i_m;
for (i_m = 0; i_m < 5; i_m++) {
char *d = (char*)malloc(sizeof(gint16));
strncpy(d,str,2);
n_oframe[i_m] = atol(d);
str = str + 2;
free(d);
}
当我尝试打印出来n_oframe值,我得到的正确的结果。请帮我
使用这些功能:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef int16_t gint16; // define gint16 if not compiling with glib.h
char *gint16_to_string(gint16 *p, int n) {
char *str = malloc(n * 4 + 1);
if (str) {
for (int i = 0; i < n; i++) {
snprintf(str + i * 4, 5, "%04X", p[i] & 0xFFFF);
}
}
return str;
}
void string_to_gint16(gint16 *p, int n, const char *str) {
if (str) {
for (int i = 0; i < n; i++) {
unsigned int x = 0;
sscanf(str + i * 4, "%4x", &x);
p[i] = (gint16)x;
}
}
}
int main(void) {
gint16 frame[5] = { 10, 2, 3, 7, 5 };
// encoding in hexadecimal
char *str = gint16_to_string(frame, 5);
printf("encoded string: %s\n", str);
// from hexa string to 16 bit integer array
gint16 n_oframe[5];
string_to_gint16(n_oframe, 5, str);
printf("n_oframe: ");
for (int i = 0; i < 5; i++) {
printf("%d, ", n_oframe[i]);
}
printf("\n");
free(str);
return 0;
}
的评论者发现,大多数的,所以把它放在一起
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
// ALL CHECKS OMMITTED!
int main()
{
int16_t frame[5] = { 10, 2, 3, 7, 5 };
// hexadecimal string = 2 characters plus NUL
// sizeof(char) == 1, if compiler is standard compliant
char *str = malloc(3 * (sizeof(frame)/sizeof(frame[0]) +1));
char *strp = str;
size_t j;
for (j = 0; j < sizeof(frame)/sizeof(frame[0]); j++) {
// again: hexadecimal string = 2 characters plus NUL
snprintf(strp, 3, "%02x", frame[j]); //hexadecimal
strp += 2;
}
// we need a pointer to the start of the string to free it later
strp = str;
// let's see if we gott all of them
printf("str = %s\n",str);
// from hexa string to 16 bit integer array
int16_t n_oframe[5];
size_t i_m;
// and again: hexadecimal string = 2 characters plus NUL
// a simple char d[3]; would have been more than suffcient
// for the task, but if stack is precious...
char *d = (char *) malloc(3);
for (i_m = 0; i_m < 5; i_m++) {
// it's always the same, just do it once at the beginning
//char *d = (char *) malloc(3);
strncpy(d, str, 2);
// atol() is for base 10 input only, use strtol() instead
n_oframe[i_m] = (int16_t)strtol(d,NULL,16);
str = str + 2;
//free(d);
}
for (j = 0; j < 5; j++) {
printf("%d ", n_oframe[j]);
}
putchar('\n');
free(d);
free(strp);
exit(EXIT_SUCCESS);
}
我改变gint16
到int16_t
,因为我不知道那是什么应该是。你很可能用gint16
代替它,没有问题。
用'snprintf(strp,3,“%02x”,0xFFu&frame [j])来保证输出有限;'。一个'int16_t'可以有像4096或-1这样的值,它会超出分配的缓冲区。 – chux
@chux'snprintf'自动处理它。 'int16_t frame [5] = {10,4096,-1,7,5}'将产生字符串'0a10ff0705'(10,16,255,7,5)。如果有足够的空间可用,'snprintf'返回它将会打印的字符数。你需要检查,但写在代码的顶部:所有检查ommitted! (包括拼写检查)。 – deamentiaemundi
的确,我读到'sprintf()'。 – chux
'sizeof(char)*(sizeof(frame)+1)'应该给出什么?特别是考虑到“框架”的类型.. –
该数组的* length *(元素的数量)是'sizeof frame/sizeof frame [0]'。 –
'free(str);'会因为你增加了str而崩溃。 – Karthick