为什么sscanf不填充变量?

时间:2012-06-13 12:42:38

标签: c gcc printf scanf

我想知道为什么在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

     

缓冲区是一些特殊字符

4 个答案:

答案 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中可能是一个好主意,因为您将它传递给期望打印的printfi 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}}“读取”您的任何数据。