Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C bzero不';不要照它说的做_C - Fatal编程技术网

C bzero不';不要照它说的做

C bzero不';不要照它说的做,c,C,我使用vscode作为我的代码编辑器,在头文件中有一个名为bzero的函数,当鼠标悬停在该函数上时vscode表示bzero将N个字节的S设置为0。但我认为它不是这样工作的。我创建了一个由11个字符组成的数组,称为s,并将其放入Hello World 然后我使用bzero将s的前4个字节设置为0,但从输出来看,它似乎清除了整个缓冲区 #包括 #包括 int main(int argc,char const*argv[] { char s[11]=“你好,世界”; b0(s,4); 卖出(s);

我使用
vscode
作为我的代码编辑器,在头文件
中有一个名为
bzero
的函数,当鼠标悬停在该函数上时
vscode
表示
bzero将N个字节的S设置为0。
但我认为它不是这样工作的。我创建了一个由11个字符组成的数组,称为
s
,并将其放入
Hello World

然后我使用
bzero
s
的前4个字节设置为0,但从输出来看,它似乎清除了整个缓冲区

#包括
#包括
int main(int argc,char const*argv[]
{
char s[11]=“你好,世界”;
b0(s,4);
卖出(s);
返回0;
}

零是字符串终止字符。因此,如果将字符串的第一个字节设置为零,
put
将认为字符串为空。

完全按照它所说的做。您所面临的问题是由于对C中字符串是什么的误解

简言之,a是一个以零结尾的缓冲区,为
char
s。也就是说,C将
char
s数组视为一个字符串,方法是考虑所有
char
s,直到找到第一个值为0的数组

put
(和
printf
等)使用“字符串”的这一定义

因此,即使将数组中的第一个
char
设置为0,也会导致空字符串,而不管后面是什么

(还要注意,
bzero
是一个遗留函数,不鼓励使用它;请改用。)

put()
需要一个指向字符串的指针。C中的字符串是以空字符(
'\0'
)结尾的字符序列*。空字符由值零表示

因此,
put()
在第一个零处停止并打印一个空字符串

打印整个缓冲区以查看
bzero()
的效果


你认为
在哪里停止打印?是什么使字符数组成为C中的字符串?@Lundin一旦
\0
到达,您可以尝试使用bzero(&s[5],4)查看差异:@真的!而且
\0
的值为零,因此它在第一个字符处停止。当然bzero需要一个指针,即s。输出解释了很多,谢谢!
$ cc main.c -o main && ./main
# empty
$ 
#include <strings.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    char s[11] = "Hello World";
    bzero(s, 4);

    for (int i = 0; i < 11; i++) printf("%d ", s[i]); // print elements of the buffer
    puts(s);
    return 0;
}
0 0 0 0 111 32 87 111 114 108 100