c语言 - scanf 何时会将''附加到用户输入?



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

另外,

我们如何确定何时以及何时附加非"\0"?

由于scanf是一个标准函数,我们从C标准中得出了这一点。从C11草案7.21.6.2p12:

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

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

还有更好看的,通常用于快速参考cpp首选项网站。

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

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

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

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

我想你想要:

size_t 胎面(无效 * 限制 PTR, size_t尺寸,size_t nmemb, 文件 * 限制流);

fread 函数从流指向的流中读取 ptr 指向的数组,最多读取大小由大小指定的 nmemb 元素。

它将读取大小sizenmemb元素到ptr指向的内存中。所以只是:

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

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

最新更新