我面临一个与sscanf一样奇怪的问题,当我按特定顺序传递参数时,我可以正确读取所有值,如果我改变顺序,它就可以正常工作.有人可以解释为什么这种奇怪的行为?
#include#include #include int main() { uint8_t oct1, oct2, oct3, oct4; char buf[20]; memset(buf, 0, sizeof(buf)); sprintf(buf,"%d.%d.%d.%d", 1, 2, 3, 4); printf("%s\n", buf); int f = sscanf(buf,"%d.%d.%d.%d", &oct1, &oct2, &oct3, &oct4); printf("%d.%d.%d.%d \nSuccessfully read - %d\n", oct1, oct2, oct3, oct4, f); return 0; } Output: 1.2.3.4 0.0.0.4 Successfully read - 4
#include#include #include int main() { uint8_t oct1, oct2, oct3, oct4; char buf[20]; memset(buf, 0, sizeof(buf)); sprintf(buf,"%d.%d.%d.%d", 1, 2, 3, 4); printf("%s\n", buf); int f = sscanf(buf,"%d.%d.%d.%d", &oct4, &oct3, &oct2, &oct1); printf("%d.%d.%d.%d \nSuccessfully read - %d\n", oct1, oct2, oct3, oct4, f); return 0; } Output: 1.2.3.4 4.3.2.1 Successfully read - 4
P.P... 5
正确的格式说明符uint8_t
是SCNu8
宏
.用法应该是:
sscanf(buf,"%" SCNu8 ".%" SCNu8 ".%" SCNu8 ".%" SCNu8, &oct1, &oct2, &oct3, &oct4);
同样,SCNu32
和SCNu16
用于uint32_t
和uint16_t
分别SCNd8
,SCNd16
,SCNd32
对int8_t
,int16_t
和int32_t
分别.
请注意,使用整数类型(在C99中引入)修复的这些是可选类型.
在旁边:
sprint
是危险的,因为它们无法阻止缓冲区溢出.建议使用snprintf()
:
snprintf(buf,sizeof buf, "%d.%d.%d.%d", 1, 2, 3, 4);
此外,memset()
ing buf
是不必要的,因为你要立即写入它(注意,snprintf()
总是NUL终止缓冲区).
正确的格式说明符uint8_t
是SCNu8
宏
.用法应该是:
sscanf(buf,"%" SCNu8 ".%" SCNu8 ".%" SCNu8 ".%" SCNu8, &oct1, &oct2, &oct3, &oct4);
同样,SCNu32
和SCNu16
用于uint32_t
和uint16_t
分别SCNd8
,SCNd16
,SCNd32
对int8_t
,int16_t
和int32_t
分别.
请注意,使用整数类型(在C99中引入)修复的这些是可选类型.
在旁边:
sprint
是危险的,因为它们无法阻止缓冲区溢出.建议使用snprintf()
:
snprintf(buf,sizeof buf, "%d.%d.%d.%d", 1, 2, 3, 4);
此外,memset()
ing buf
是不必要的,因为你要立即写入它(注意,snprintf()
总是NUL终止缓冲区).