是否可以sscanf使用多個格式說明符運行,每個格式說明符都會在陣列中設定一個專案?目前,我必須分別指定指向每個陣列槽的指標,感覺很重復:
unsigned int buffer[8];
sscanf(
line,
"%6o %6o %6o %6o %6o %6o %6o %6o",
buffer 0,
buffer 1,
buffer 2,
buffer 3,
buffer 4,
buffer 5,
buffer 6,
buffer 7);
我正在尋找類似于 JavaScript 的擴展運算子或 Python 的*-operator 來解包引數串列的東西:
sscanf(
line,
"%6o %6o %6o %6o %6o %6o %6o %6o",
...buffer);
目前,這失敗并出現以下錯誤:
file.c:42:21: 錯誤:格式 '%o' 需要匹配的 'unsigned int *' 引數 [-Werror=format=]
這是一種預期。我怎么知道sscanf將每個格式說明符值放入陣列中的連續插槽中?是否可以?如果沒有,是否有巧妙的解決方法(hack)?
uj5u.com熱心網友回復:
如何告訴 sscanf 將每個格式說明符值放入陣列中的連續插槽中?是否可以?如果沒有,是否有巧妙的解決方法(hack)?
使用回圈。
健壯的代碼還會檢測是否line不包含 8 組八進制數字文本。
strtol()回圈的替代方法是sscanf()使用"%6o %n".
" %n" 掃描可選的空白,然后保存掃描的偏移量。
size_t n = sizeof buffer / sizeof buffer[0]; // 8
const char *p = line;
size_t i;
for (i = 0; i < n; i ) {
int n = 0;
if (sscanf(p, "%6o %n", &buffer[i], &n) != 1) { // or use strtol()
Handle_scanf_failure(); // Add user code here to cope with this error
}
p = n; // Advance p to the next part of the buffer
}
if (*p != '\0') {
Handle_junk_at_end_of_buffer(); // Add user code here to cope with this error
}
strtol()處理溢位比 更好"%o",但由于我們的最大寬度為 6 個八進制數字,這將防止 32 位unsigned.
uj5u.com熱心網友回復:
我怎么知道
sscanf將每個格式說明符值放入陣列中的連續插槽中?是否可以?
根據scanf沒有這樣的轉換說明符。
如果沒有,是否有巧妙的解決方法(hack)?
是的,一次回圈并提取一個。strtoul在這種情況下可能有用。
例子:
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
size_t scan_uint_array(const char *line, unsigned int buffer[], size_t count, int base)
{
char *str_end;
for(size_t i = 0; i < count; i) {
unsigned long tmp = strtoul(line, &str_end, base);
if(str_end == line) return i; // no conversion done
if(errno == ERANGE) return i; // out of range for ULONG
if(tmp > UINT_MAX) { // out of range for UINT
errno = ERANGE;
return i;
}
buffer[i] = tmp; // all good, save this
line = str_end; // move line to where the next scan should be done
}
return count;
}
#define Size(x) (sizeof (x) / sizeof *(x))
int main() {
unsigned int buffer[8];
size_t ex = scan_uint_array(" 1 2 3 4 5 6 7 ", buffer, Size(buffer), 8);
printf("extracted=%zu wanted=%zu\n", ex, Size(buffer));
for(size_t i = 0; i < ex; i)
printf("%u ", buffer[i]);
}
輸出
extracted=7 wanted=8
1 2 3 4 5 6 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/402622.html
標籤:
