gpt4 book ai didi

C : Segmentation fault with typecasting

转载 作者:行者123 更新时间:2023-11-30 20:59:17 27 4
gpt4 key购买 nike

在我的 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);

最佳答案

问题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 假定字符串已经以 null 结尾,因此您不能编写类似 str[strlen(str)]='\0'; 的代码。

关于C : Segmentation fault with typecasting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47812683/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com