将struct条目传递给字符串,反之亦然

时间:2017-06-02 15:10:58

标签: c string pointers struct

我们说我有这样的结构:

typedef struct {
   unsigned s_i, s_j;
   unsigned d_i, d_j;
} obs_t

我想定义一个函数:

obs_t * string_to_struct (char * s);

其中读取格式化的字符串,例如,如下所示:" 1 1 4 6"并将四个数字传递给struct obs_t。到目前为止,我无法避免分段错误,我使用以下代码:

obstacle_t * string_to_obstacle (char * s){
obstacle_t *ostacolo = malloc(sizeof(obstacle_t));
unsigned int **format;
sscanf(s, "%u %u %u %u", format[0], format[1], format[2], format[3]);
ostacolo -> s_i = *format[0];
ostacolo -> s_j = *format[1];
ostacolo -> d_i = *format[2];
ostacolo -> d_j = *format[3];
}

1 个答案:

答案 0 :(得分:3)

您永远不会初始化指针值 format ,因此它具有indeterminate值,并且取消引用它具有未定义的行为。使用指向int的指针,你必须为4指针分配空间并指向格式,然后为4个整数分配空间并设置指针指向那些指针。

您也不检查malloc和sscanf的返回值,因此如果sscanf失败,您可能要么取消引用NULL指针,要么将未指定的值分配给ostacolo的字段。你的非空函数中也没有return语句。

这是一个解决这些问题的string_to_obstacle版本:

obstacle_t * string_to_obstacle (char * s)
{
        obstacle_t *ostacolo = malloc(sizeof *ostacolo);

        if (!ostacolo) {
                return NULL;
        }

        if (sscanf(s, "%u %u %u %u", &ostacolo->s_i, &ostacolo->s_j, &ostacolo->d_i, &ostacolo->d_j) < 4) {
                free(ostacolo);
                return NULL;
        }

        return ostacolo;
}

请记住,sscanf无法处理传递较大的整数而不适合字符串中的无符号整数。 The behavior is undefined