我面临一个与sscanf一样奇怪的问题,当我按特定顺序传递参数时,我可以正确读取所有值,如果我改变顺序,它就可以正常工作.有人可以解释为什么这种奇怪的行为?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
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
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <stdint.h>
#include <string.h>
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
Run Code Online (Sandbox Code Playgroud)
正确的格式说明符uint8_t是SCNu8宏<inttypes.h>.用法应该是:
sscanf(buf,"%" SCNu8 ".%" SCNu8 ".%" SCNu8 ".%" SCNu8, &oct1, &oct2,
&oct3, &oct4);
Run Code Online (Sandbox Code Playgroud)
同样,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);
Run Code Online (Sandbox Code Playgroud)
此外,memset()ing buf是不必要的,因为你要立即写入它(注意,snprintf()总是NUL终止缓冲区).