我想知道为什么在i
之前调用0
之后sscanf
的值为i
。我期待修改#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
unsigned char a[] = {1, 2, 3, 4, 5};
int i = 0;
printf("\nread value %d\n", sscanf(&a, "%d", &i));
printf("\nvalue is %d\n", i);
printf("\nbuffer is %s\n", a);
}
的价值。
我在windows 7版本3.4.4中使用cygwin gcc
{{1}}
输出
读取值为0
值为0
缓冲区是一些特殊字符
答案 0 :(得分:2)
首先,sscanf的第一个参数应该是指向char的指针,但是你传入一个指向char数组的指针,这是一个错误的类型。这只是问题的切入点。
回答你的问题:sscanf(与其他* scanf函数一样)只有在字符串中匹配该值的格式说明符时才会写入值。因此,如果您具有格式说明符“%d”,则仅当字符串以数字开头时,才会将int写入给定的int指针。正如你自己所说,你的字符串只包含垃圾:值为1到5的(不可打印的)字符,后跟a
之后的内存中的任何内容。所以它不是以数字开头,因此没有编写数字。
答案 1 :(得分:1)
sscanf用于STRINGS,而不是没有终止字符\ 0的字符数组。
http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
从字符串读取格式化数据从str读取数据并存储它们 根据参数格式输入的位置 其他论点。每个附加参数指向的位置 填充了其中指定的相应类型的值 格式字符串。
答案 2 :(得分:1)
您的代码中没有意外行为。请注意,函数sscanf
从给定字符串中读取数据,“返回填充的变量数”。您正在传递char
数组a
作为源来从中检索数据,而不仅仅是它不包含任何数字(1
与'1'
不同)它也不是以空值终止的('\0'
缺失)。
按"%d"
指定应读取十进制整数,但给定数组中没有十进制整数,因此sscanf
不会读取任何数字,而i
保持不变。函数返回0
,表示没有填充变量。
将要传递的数组的声明更改为sscanf
到有效字符串,它将产生所需的行为。试试char a[] = "1 2 3"
。
答案 3 :(得分:0)
这将为您提供您的期望。
a
已经是指针,因此只需a
作为sscanf
的第一个参数就足够了。将{(\0
)作为a
中的最后一个条目放在sscanf
中可能是一个好主意,因为您将它传递给期望打印的printf
和i
null -terminated string。
我还将unsigned char
的类型更改为int main()
{
unsigned char a[] = {1, 2, 3, 4, 5, 0};
unsigned char i = 0;
printf("\nread value %d\n", sscanf(a, "%c", &i));
printf("\nvalue of i is %d\n", i);
printf("\nbuffer is %s\n", a);
return 0;
}
以匹配您正在阅读的数据。
sscanf
注意:您之前收到0,因为a
无法从{{1}}“读取”您的任何数据。