大家好我尝试将string
分配到char *
指针。以下是我的工作方式,但我收到了警告: assignment makes integer from pointer without a cast.
在C中处理字符串的正确原因是什么?
char* protoName = "";
if(h->extended_hdr.parsed_pkt.l3_proto==0)
*protoName = "HOPOPT";
else if(h->extended_hdr.parsed_pkt.l3_proto==1)
*protoName = "ICMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==2)
*protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==3)
*protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==4)
*protoName = "IGMP";
char all[500];
sprintf(all,"IPv4','%s'",* protoName);
答案 0 :(得分:8)
如果您只想更改哪个字符串文字protoName
指向,则只需更改
*protoName = "HOPOPT";
到
protoName = "HOPOPT";
*protoName =
尝试写入protoName
指向的第一个字符。这不适用于您的情况,因为protoName
指向无法修改的字符串文字。
您还需要将sprintf
来电更改为
sprintf(all,"IPv4','%s'", protoName);
%s
格式说明符表示您将传递指向以nul结尾的char
数组的指针。 *protoName
为您提供protoName
指向的第一个字符的字符代码; sprintf
不知道这一点,所以会将该字符代码视为要读取的数组的地址。你没有这个记忆,所以读取它的效果是不明确的;很可能会崩溃。
顺便说一句,如果你有一个可写的char
数组并希望更改其内容,则需要使用strcpy
将新的字符数组复制到其中。
答案 1 :(得分:2)
如果使用常量,则只需重新指定指针,而不是内容:
const char* protoName = "";
if(h->extended_hdr.parsed_pkt.l3_proto==0)
protoName = "HOPOPT";
else if(h->extended_hdr.parsed_pkt.l3_proto==1)
protoName = "ICMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==2)
protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==3)
protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==4)
protoName = "IGMP";
答案 2 :(得分:2)
以下是一些例子:
#include <stdio.h>
const char * protoNameFromPktId(int id) {
static char* protoName[] = { "HOPOPT", "ICMP", "IGMP", "IGMP","IGMP"};
return protoName[id];
}
main() {
printf("%s\n", protoNameFromPktId(2));
char all[500];
sprintf(all,"%s", protoNameFromPktId(2));
strcpy(all, protoNameFromPktId(2));
}
答案 3 :(得分:1)
你只需要这样做: -
protoName = "HOPOPT";
而不是
*protoName = "HOPOPT";
所以改变如下: -
char* protoName = "";
if(h->extended_hdr.parsed_pkt.l3_proto==0)
protoName = "HOPOPT";
else if(h->extended_hdr.parsed_pkt.l3_proto==1)
protoName = "ICMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==2)
protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==3)
protoName = "IGMP";
else if(h->extended_hdr.parsed_pkt.l3_proto==4)
protoName = "IGMP";
char all[500];
sprintf(all,"IPv4','%s'",* protoName);
答案 4 :(得分:1)
我可以看到的主要问题是你没有为字符串绑定内存,所以你必须使用malloc
或更好地使用strdup自动分配内存的函数。因为如果您分配了大字符串,那么您应该遇到问题。
警告的问题由其他人回答,所以没关系。如果我错了,请纠正我。
char* protoName; if(h->extended_hdr.parsed_pkt.l3_proto==0){ protoName = strdup("HOPOPT"); } else if(h->extended_hdr.parsed_pkt.l3_proto==1){ protoName = strdup("ICMP"); ... char all[500]; sprintf(all,"IPv4','%s'",* protoName); free(protoName);