[英]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.