据我所知,scanf("%s",arr);
会自动将'\0'
附加到用户输入。但我认为它仅限于此。然而,即使scanf("%[^\n]",arr);
也附加'\ 0'。(我知道这会扫描所有字符,直到达到换行符)。在这种情况下,'\0'
将在'\n'
之后或在'\n'
之前附加。另外我们如何计算何时何时不会附加'\0'
?我们如何扫描多个字符才能形成字符数组而不是字符串?
另外我们如何计算何时何时不会附加'\ 0'?
由于scanf
是一个标准函数,我们从C标准中得出结论。来自C11 draft 7.21.6.2p12:
小号 ...相应的参数应该是一个指向大小足以接受序列的字符数组的初始元素的指针和一个终止的空字符,它将自动添加。 ...
[ ...相应的参数应该是一个指向大小足以接受序列的字符数组的初始元素的指针和一个终止的空字符,它将自动添加。 ...
还有更好的外观和常用于快速参考cppreference网站。
我强烈建议你永远不要使用%s
和%[
而没有指定“最大字段宽度”的数字(除非你知道你可以使用它)。始终使用%<number>s
和%<number>[
来限制字符读取次数并防止溢出。所以总是:
char arr[20];
scanf("%19s", arr);
scanf
以这种方式非常不安全,在读取字符串时很容易发生堆栈溢出。
我们如何扫描多个字符才能形成字符数组而不是字符串?
我想你想要:
size_t fread(void * restrict ptr,size_t size,size_t nmemb,FILE * restrict stream);
fread函数在ptr指向的数组中,从stream指向的流中读取大小由size指定的nmemb元素。
它会将nmemb
大小的size
元素读入ptr
指向的记忆中。所以就:
char character_array[20];
size_t number_of_chcaracter_read = fread(character_array, 20, 1, stdin);
它不会将终止空字节附加到character_array
。