scanf何时将“ \ 0”附加到用户输入?

时间:2019-03-28 07:25:39

标签: c arrays string scanf

我知道scanf("%s",arr);会自动将'\0'附加到用户输入中。但是我认为这仅限于此。但是,即使scanf("%[^\n]",arr);也会附加一个'\ 0'。(我知道这会扫描所有字符,直到到达换行符为止)。在这种情况下,'\0'将附加在'\n'之后或'\n'之前。另外,我们如何确定何时以及何时不附加'\0'?我们如何扫描许多字符以形成一个字符数组而不是一个字符串?

1 个答案:

答案 0 :(得分:3)

  

我们又如何确定何时以及何时不附加'\ 0'?

由于scanf是一个标准函数,因此从C标准中可以看出这一点。来自C11 draft 7.21.6.2p12

  

s
   ...相应的参数应为指向字符数组的初始元素的指针,该元素应足够大以接受序列和终止的空字符(将自动添加)。 ...

     

[
  ...相应的参数应为指向字符数组的初始元素的指针,该元素应足够大以接受序列和终止的空字符(将自动添加)。 ...

外观更漂亮,通常用于快速引用cppreference网站。

我强烈建议您不要在没有数字指定“最大字段宽度”的情况下使用%s%[(除非您知道可以使用它)。始终使用%<number>s%<number>[,以限制读取的字符数并防止溢出。所以总是:

char arr[20];
scanf("%19s", arr);

scanf以这种方式是非常不安全的功能,读取字符串时很容易发生堆栈溢出。

  

我们如何扫描许多字符以形成一个字符数组而不是一个字符串?

我想你想要

  

size_t fread(无效*限制ptr,                 size_t大小,size_t nmemb,                 FILE *限制流);

     

fread函数从stream指向的流中读取ptr指向的数组中的多达nmemb元素,这些元素的大小由size指定。

它将读取nmemb指向的内存中的size个元素,大小为ptr。因此:

 char character_array[20];
 size_t number_of_chcaracter_read = fread(character_array, 20, 1, stdin);

它不会将终止的空字节附加到character_array