簡體   English   中英

將struct條目傳遞給字符串,反之亦然

[英]Passing struct entries to string and vice-versa

假設我有一個像這樣的結構:

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

您永遠不會初始化指針值格式 ,因此它具有不確定的值,並且取消引用它具有未定義的行為。 使用指向int的指針,你必須為其指定4個指向int和point 格式的空間,然后為4個整數分配空間並將指針設置為指向那些指針。

您也不檢查malloc和sscanf的返回值,因此如果sscanf失敗,您可能要么取消引用NULL指針,要么將未指定的值分配給ostacolo的字段。 您的非void函數中也沒有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無法處理傳遞較大的整數,而不能處理字符串中無符號整數。 行為未定義

暫無
暫無

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

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