在我的C代码中,我的字符串(类型'char')包含捕获的数据包的有效载荷。由于无法打印其某些内容,因此我尝试将它们打入"未签名的char"。我有一个细分错误。键入" char"会导致相同的结果。
可以将类型的结果导致分割故障吗?如果是的,那么何时会导致分割故障?
update
我正在尝试检查有效载荷是否包含任何URL。每个数据包的" payload_length"都会变化,并且可能很大。
char str[payload_length+10];
size_t size_read;
str[strlen(str)]=' ';//Adding ' ' after loading the payload contents.
if((pos=strstr((char)str,"http"))==NULL || (pos=strstr((char)str,"Host:"))==NULL || (pos=strstr((char)str,".com"))==NULL || (pos=strstr((char)str,"www."))==NULL)
printf("nNo distinct URL is presentn ");
else
printf("nURL is at %p ",pos);
问题1: (char)str
。您将数组投入到一个char
中。这是胡说八道,您应该知道为什么。另外,如果没有编译器消息,这应该不是编译,否则您的编译器是垃圾。
问题2:您每次更新pos
,||
从左到右进行强制性评估。在".com"
之后使用"www"
是一个非常奇怪的URL。因此,在pos=strstr((char)str,".com"
之后,您指着字符串的末端,您在任何地方都找不到"www"
。
编写如此晦涩的单线代码的替代方法可能是这样:
bool validate_url (const char* str)
{
const char* MUST_CONTAIN[] =
{
"http",
"Host:",
".com",
"www"
};
for(size_t i=0; i<sizeof(MUST_CONTAIN)/sizeof(*MUST_CONTAIN); i++)
{
if(strstr(str, MUST_CONTAIN[i] == NULL)
{
return false;
}
}
return true;
}
如果您可以假设字符串以特定顺序存在(您应该可以)。
,则可以进行优化。
。问题3:strlen
假定字符串已经终止,因此您不能像str[strlen(str)]=' ';
一样编写代码。