如何在c中找出字符串的字节大小

时间:2013-09-13 12:12:40

标签: c sockets

我有一个字符串说

    char resp_buf[20000];

    sprintf(resp_buf,"HTTP/1.0 404 File not Found.\r\nContent-Type: text/html\r\\
n\r\n<html><body><h2>Error 404: The file your have requested does not exist.</h2\
></body></html>");

所以在此之后,我打电话给发送 - > <>;

send(fd,resp_buf,strlen(a),0);

数据确实已发送但服务器崩溃并导致分段错误。

如何找到以字节为单位的大小,以便我可以在send()中使用它来进行套接字编程。我收到了大量的分段错误。我已经尝试过strlen(a)和sizeof(a),但是两者都给了

  

分段错误(核心转储)

3 个答案:

答案 0 :(得分:0)

int sprintf(char * restrict str, const char * restrict format, ...);

返回打印为返回值的字节数,您可能想尝试使用它。

或者总是

size_t strlen(const char *s);

答案 1 :(得分:0)

您正在尝试在堆栈上分配20000个字节。首先,这可能是导致崩溃的原因。您甚至不应该尝试这样做,而且我不会告诉您更好的方法来分配缓冲区,因为整个方法都是错误的,所以我只是帮助您错误地理解工作。< / p>

@mbratch对sizeof()完全错误。你无法知道结果字符串总是与事先确定的sizeof(resp_buf)字节完全相同,事实上,你发布的代码会产生一个远不及那么久的字符串。所以这会写出一些数据和大量垃圾,这很可能不是你想要的。

当(稍后,可能是为了响应来自Marketing的请求)这个错误HTML被修改时会发生什么?你是否打算每次改变他们对副本的想法时重新编译你的程序?这不是我的乐趣。请谷歌“开放编码”,即“硬编码”和“反模式”。

当第一个arg不是完全由您控制的格式字符串时,您不应该使用printf系列函数,否则您会冒格式字符串漏洞的风险。谷歌也是如此。饼干喜欢像你这样的人。在你的情况下,它是一个常量字符串,而不是格式字符串。

你可能想要更像是使用fdopen将fd转换为FILE *,然后使用fputs,数据来自文件。但更有可能你真的想要使用PHP或CMS等。

我认为你应该认真地问自己为什么要用极少量的C知识来编写世界上最疯狂的网络服务器。 Apache非常擅长向Web提供文件。

您未能告诉我们您要实现的目标,从而阻止我们帮助您避免这种情况。

如果可以的话,我会把这个问题投下来甚至更多。

答案 2 :(得分:0)

您可以尝试使用valgrind。它可以帮助您找到内存泄漏和相关行为。

http://valgrind.org/