0

我想知道为什么之前调用了iis 0after的值。sscanf我期待的价值i被修改。

我在 Windows 7 版本 3.4.4 中使用 cygwin gcc

#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);
}

输出是

读取值为 0

值为 0

缓冲区是一些特殊字符

4

4 回答 4

2

首先,sscanf 的第一个参数应该是一个指向 char 的指针,但是您传递了一个指向 char 数组的指针,这是错误的类型。不过,这与问题无关。

要回答您的问题: sscanf (也像其他 *scanf 函数一样)仅在该值的格式说明符在字符串中匹配时才写入该值。因此,如果您有格式说明符“%d”,则仅当字符串以数字开头时,才会将 int 写入给定的 int 指针。正如您自己所说,您的字符串仅包含垃圾:值为 1 到 5 的(不可打印的)字符,后跟内存中的任何内容a。所以它不以数字开头,因此没有写数字。

于 2012-06-13T12:52:59.840 回答
1

sscanf 用于字符串,而不是没有终止字符 \0 的字符数组。

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

从字符串读取格式化数据 从 str 读取数据并根据参数格式将它们存储到附加参数给出的位置。每个附加参数指向的位置都用格式字符串中指定的相应类型的值填充。

于 2012-06-13T12:47:49.173 回答
1

您的代码中没有意外行为。请注意,函数sscanf从给定字符串中读取数据并“返回填充的变量数”。您将char数组a作为源传递以从中检索数据,不仅它不包含任何数字(1与 不同'1'),它也不是以空值结尾的('\0'丢失)。

通过"%d"您指定应读取十进制整数,但给定数组中没有十进制整数,因此sscanf不会读取任何数字并且i保持不变。函数返回0指示没有填充变量。

将要传递的数组的声明更改sscanf为有效字符串,它将产生所需的行为。试试char a[] = "1 2 3"

于 2012-06-13T12:51:47.983 回答
0

这会给你你所期望的。

a已经是一个指针,所以只要a作为第一个参数就足够了sscanf。将 0 (即\0)作为最后一个条目可能是一个好主意,a因为您将它传递给两者sscanf并且printf期望打印一个以null结尾的字符串。

我还更改了 to 的类型iunsigned 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;
}

注意:您之前得到 0 是因为sscanf未能从a.

于 2012-06-13T12:51:43.880 回答