在我的C代码中,我的字符串(类型为'char')包含捕获数据包的有效负载。由于某些内容无法打印,我尝试将它们转换为'unsigned char'。我收到了分段错误。 对'char'进行类型转换会产生相同的结果。
类型转换会导致分段错误吗?如果是,那么类型转换何时会导致分段错误?
更新
我正在尝试检查有效负载是否包含任何URL。 'payload_length'因每个数据包而异,可能非常大。
char str[payload_length+10];
size_t size_read;
str[strlen(str)]='\0';//Adding '\0' 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 present\n ");
else
printf("\nURL is at %p ",pos);
答案 0 :(得分:1)
问题1:
class course {
protected $primaryKey = 'couseid';
}
。您将数组转换为单个(char)str
。这是无稽之谈,你应该知道为什么。此外,如果没有编译器消息,这应该不干净地编译,或者你的编译器是垃圾。
问题2:您每次都更新char
,pos
从左到右进行强制性评估。在||
之后获得"www"
将是一个非常奇怪的网址。因此,在".com"
之后,您指向字符串的末尾,您将永远不会在任何地方找到pos=strstr((char)str,".com"
。
编写这种模糊的单行代码的替代方法可能是这样的:
"www"
如果您可以假设字符串以特定顺序存在(您应该可以),则可以进行优化。
问题3: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;
}
假设字符串已经以空值终止,因此您无法编写strlen
之类的代码。