在c中将字符串转换为整数数组

时间:2016-11-14 15:18:45

标签: 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值时,我得到了正确的结果。请帮帮我

2 个答案:

答案 0 :(得分:1)

使用以下功能:

#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;
}

答案 1 :(得分:1)

评论者发现了大部分内容,所以要把它们放在一起

#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