Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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中字符串的字节大小_C_Sockets - Fatal编程技术网

如何计算c中字符串的字节大小

如何计算c中字符串的字节大小,c,sockets,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>")

我有话要说

    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()中使用它进行套接字编程。我得到了一大堆分割错误。我试过strlen(a)和sizeof(a),但这两种方法都给出了答案

分段故障(堆芯转储)

返回作为返回值打印的字节数,您可能希望尝试使用该值

或者总是有

size_t strlen(const char *s);

您试图在堆栈上分配20000字节。首先,这可能是坠机的原因。你甚至不应该尝试这样做,我不会告诉你一个更好的分配缓冲区的方法,因为整个方法都是错误的,所以我只是帮助你得到错误的想法,让它一瘸一拐地工作

@mbrach对sizeof()的看法完全错误。您无法知道结果字符串的长度总是精确到sizeof(resp_buf)字节,事实上,您发布的代码生成的字符串的长度远没有那么长。因此,这将写入一些数据和大量垃圾,这很可能不是您想要的

当(稍后,可能是响应市场营销部的请求)修改此错误HTML时会发生什么情况?你是否计划在他们每次改变主意时重新编译你的程序?那不是我的乐趣。请谷歌搜索“开放编码”又名“硬编码”和“反模式”

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

您可能更希望使用fdopen将fd转换为文件*,然后使用FPUT,数据来自文件。但更可能的情况是,您真的想要使用PHP或CMS之类的东西

我认为你应该认真地问自己,为什么你要用很少的C语言知识来编写世界上最糟糕的web服务器。Apache非常擅长向Web提供文件

你没有告诉我们你想要实现什么,因此我们无法帮助你避免


如果可以的话,我会投票否决这个问题。你可以尝试使用valgrind。它可以帮助您找到内存泄漏和相关行为


strlen(a)
sizeof(a)
在这种情况下应该可以工作。请显示您的代码。并让我们知道什么编译器/系统等--“strlen(a)”应该工作。我刚刚添加了代码和我正在做的工作流程。请,如果您遇到segfault,您必须向我们显示代码行错误所在的位置和堆栈跟踪。它就在你面前的屏幕上,你为什么要让我们猜呢?@ManojAwasthi我相信
sprintf
总是以零结束字符串。
int sprintf(char * restrict str, const char * restrict format, ...);
size_t strlen(const char *s);