我有C程序,该程序已经接受了一个参数,将其存储到缓冲区中,然后将其传递给写函数:
main(int argc, char** argv) {
...
char buff[1000];
strcpy(buff, argv[1]);
write(server_socket, buff, sizeof(buff));
...
return 0;
}
如果我执行我的代码./testCode "equinox
“,equinox
将存储在缓冲区中,然后将缓冲区传递给write()
函数。在这种情况下,一切都会按预期进行。
有没有一种方法可以跳过将参数存储在缓冲区中的部分,然后将其传递给write()的方法?
如果我这样做,是否正确?
write(server_socket, argv[1], sizeof(argv[1]));
我什至不确定这是否能按预期工作。
答案 0 :(得分:5)
此声明
write(server_socket, buff, sizeof(buff));
这句话
write(server_socket, argv[1], sizeof(argv[1]));
都不正确,因为它们没有正确指定要写入的字节数。
在第一种情况下,字符串的大小可以小于buff的大小。在第二种情况下,使用的指针大小等于4或8个字节。
您需要的是
write(server_socket, argv[1], strlen( argv[1] ) );
或
write(server_socket, buff, strlen(buff));
答案 1 :(得分:1)
是,它可以工作,但稍作修改:
write(server_socket, argv[1], strlen(argv[1]));
由于argv[1]
是指向char
数组的指针,所以sizeof
运算符将返回计算机中指针的大小(如果您使用的是指针,则返回8。 64位计算机)。相反,您应该使用strlen
来获取要写入的字节数。