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