为什么我必须在scanf("%type",&array[x])
函数中传递类似变量的数组,而不是scanf("%type",array[x])
,我认为它们应该是指针“指向另一个地址的特殊指针”。如果我是错误的希望有人可以澄清我。
另一件事有两个简单的代码。哪一个更好 ? 我对干净的编码感兴趣,但我还是初学者。
for(_a_i = 0; _a_i < _a_size; _a_i++) {
int _a_item;
scanf("%d", &_a_item);
_a[_a_i] = _a_item;
}
其他人
for(_a_i = 0; _a_i < _a_size; _a_i++) {
scanf("%d", &_a[_a_i]);
}
答案 0 :(得分:1)
在特定情况下 note ,只有类型为“array”的表达式才会转换为“指向数组第一个元素的指针”。这不适用于单个数组元素,因此您必须在将值扫描到各个数组成员时显式使用addressof运算符。
那说,关于片段,
scanf()
的返回值以确保安全。所有以下划线开头的标识符都应该保留,不要试图不必要地使用它们。
引用C11
,章节§7.1.3,保留标识符
- 所有以下划线和大写字母或其他字母开头的标识符 下划线总是保留用于任何用途。
注意:
引用C11
,章节§6.3.2.1,(强调我的)
除非,它是
sizeof
运算符,_Alignof
运算符或者&
运算符的操作数。 一元main_dir=/HDD1 complete_path="$main_dir/Movies/Excursion.2016/name2" if [[ "$complete_path" =~ $main_dir/[^/]+/(.+)$ ]] then echo "${BASH_REMATCH[1]}" else echo "Path not valid" >&2 fi
运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]
答案 1 :(得分:0)
为什么我必须在
scanf("%type",&array[x])
函数中传递类似变量的数组,而不是scanf("%type",array[x])
,...?
虽然array
是数组。 下标运算符 []
指定数组array[x]
的元素。
假设array[x]
是int
。 &array[x]
就是int
的地址,int
。
然后问题变成
为什么我必须在
int
函数中传递scanf("%type",&array[x])
的地址,而不是在int
中传递scanf("%type",array[x])
,...?
scanf()
需要知道将输入文本转换存储到int
的位置的地址。函数的所有参数都按值接收。
在函数调用之前假设array[x] = 42;
。如int
所示,传递scanf("%type",array[x])
的值不会提供存储转化位置的scanf()
信息。它与scanf("%type", 42)
相同,它当然不提供将结果存储在array[x]
中的信息。
关于&#34;清洁编码&#34;。两个代码段都没有检查scanf()
的结果 - 这是一个重大缺点。没有这个检查代码不知道扫描成功。
if (scanf("%d", &_a[_a_i]) != 1) Handle_Error_or_EOF().
根据错误处理情况,在销毁_a[_a_i]
int x;
if (scanf("%d", &x) != 1) Handle_Error_or_EOF().
else _a[_a_i] = x;
在 style 的情况下,最好根据您的群组编码标准进行编码。