将数组传递给scanf函数和变量

时间:2017-01-16 13:56:02

标签: c arrays pointers scanf

为什么我必须在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]);

       }

2 个答案:

答案 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 的情况下,最好根据您的群组编码标准进行编码。