gpt4 book ai didi

c - scanf() 的行为

转载 作者:行者123 更新时间:2023-12-02 05:35:08 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




11年前关闭。




Possible Duplicate:
confusion in scanf() with & operator



为什么我们需要在 scanf 中使用 & 来输入整数,为什么不需要字符。
在获取输入时,scanf 中的 & 指的是 merory 位置。

例如:-
main()
{
int a;
char c;

scanf("%d",&a);
scanf("%c"c);
}

最佳答案

对于每个转换说明符,scanf()期望相应的参数是指向正确类型的指针:%d需要 int * 类型的参数, %f需要 double * 类型的参数, %c%s两者都期望 char * 类型的参数, ETC。
%c 之间的区别和 %s是前者告诉scanf()读取单个字符并将其存储在相应参数指定的位置,而后者告诉 scanf()读取多个字符,直到它看到一个 0 值字符,并将所有这些字符存储在缓冲区中,从参数指定的位置开始。

您需要使用 &如果参数还不是指针类型,则在参数上使用运算符。例如:

int x;
int *px = some_valid_memory_location_such_as_&x;
char c;
char *pc = some_valid_memory_location_such_as_&c;
...
scanf("%d", &x); // x is not a pointer type, so we must use the & operator
scanf("%d", px); // px is a pointer type, so we don't need the & operator
scanf("%c", &c); // etc.
scanf("%c", pc); // etc.

令人困惑的地方是读取字符串(使用 %s 转换说明符):
char buf[SIZE];
scanf("%s", buf); // expression 'buf' *implicitly* converted to pointer type

为什么我们不需要 &在这种情况下运营商?它与 C 如何处理数组表达式有关。当编译器看到数组类型的表达式(如 buf 调用中的 scanf())时,它会隐式转换类型为 N-element array of T 的表达式。至 pointer to T ,并将其值设置为数组中第一个元素的地址。这个值不是左值——它不能被赋值(所以你不能写像 buf = foo 这样的东西)。此规则的唯一异常(exception)是当数组表达式是 sizeof 的操作数时。或 &运算符,或者如果数组表达式是用于初始化另一个数组的字符串文字:
char *p = "This is a test";  // string literal implicitly converted to char *,
// string *address* written to p
char a[] = "This is a test"; // string literal not implicitly converted,
// string *contents* copied to a

简而言之,表达式 buf从类型 char [SIZE] 隐式转换至 char * ,所以我们不需要使用 &运算符,实际上是表达式 &buf 的类型将是 pointer to SIZE-element array of char , 或 (*)[SIZE] ,这不是 scanf()预计 %s转换说明符。

关于c - scanf() 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com